Objective-C面试深度解析:从基础到Runtime

需积分: 0 0 下载量 16 浏览量 更新于2024-06-30 收藏 385KB PDF 举报
"面试题整理,涵盖Objective-C基础与Runtime机制" 面试题涉及Objective-C的基础概念和Runtime机制,这是理解iOS开发的关键。以下是对这些知识点的详细解释: 1. **id、self、super的区别** - `id`:是Objective-C的通用类型,可以指向任何Objective-C对象,表示未知类型的对象指针。 - `self`:在方法内部,`self`代表当前对象,它是一个指向调用该方法的对象的指针。 - `super`:在方法内部,`super`用于调用父类的方法,它也指向当前对象,但消息会被传递到父类的实现中。 2. **isa**:每个Objective-C对象都有一个隐藏的`isa`指针,它指向对象所属的类,用来确定对象可以响应哪些消息。 3. **Objective-C的ABI稳定性**:Objective-C通过在运行时解析消息传递,使用分类(categories)、协议(protocols)和动态加载(dyld)等特性来确保ABI(应用程序二进制接口)的稳定性。即使系统升级,旧的二进制代码也能与新的运行时环境兼容。 4. **OC中对象的内存布局**:通常包括对象头(包含`isa`指针和其他信息)、实例变量(ivar)和对齐填充。 5. **nil、Nil、null、NSNull的区别** - `nil`:指向Objective-C对象的空指针,对于对象类型的指针,`nil`表示对象不存在。 - `Nil`:指向类的空指针,通常用于类对象的指针。 - `null`:C语言中的空指针,适用于所有类型的指针。 - `NSNull`:Objective-C中的特殊对象,用于表示“无值”或单个对象的“空值”。 6. **一个NSObject占用的内存**:通常情况下,一个空的`NSObject`实例占用的内存大小包括对象头(包含`isa`指针)和对齐填充。 7. **OC的类信息存放**:类信息存储在内存中的类结构体中,包括类名、超类、实例变量列表、方法列表等。 8. **Runtime相关知识点**: - 对象、类对象、元类之间的关系:对象是实例,类对象是类的实例,元类是类的类对象,它们之间通过`isa`指针相互关联。 - `class_ro_t`和`class_rw_t`:前者表示只读部分,包含类的信息;后者表示可读写部分,如方法、属性、协议等。 - 内省方法:`class`、`objc_getClass`等,前者获取对象的类,后者获取指定名称的类。 - `objc_allocateClassPair`中的`pair`表示同时创建类和元类。 - `fastpath`、`slowpath`:编译器优化技术,`fastpath`用于快速路径,`slowpath`用于可能较慢的情况。 - `SideTables`:用于存储对象的额外信息,如弱引用表、关联对象等。 9. **消息转发机制**:当对象接收到无法处理的消息时,会经历完整的消息转发过程,包括`forwardingTargetForSelector`、`methodSignatureForSelector`、`forwardInvocation`等步骤。 10. **Objective-C的动态性**:Objective-C允许在运行时添加方法、改变类结构、动态加载类等,因此它是动态语言。 11. **unrecognized selector错误**:当发送一个对象不支持的消息时,会抛出这个错误。可以通过方法签名检查、遵循协议、异常处理等手段预防。 12. **添加实例变量**:编译后的类不能直接添加实例变量,但可以通过Runtime在运行时创建新类来实现。 13. **添加属性的影响**:添加属性会修改类的`class_rw_t`结构,增加属性的声明和实现信息。 14. **类方法与实例方法的区别**:类方法以`+`开头,作用于类本身;实例方法以`-`开头,作用于类的实例。 15. **运行时增加成员变量和属性**:运行时不能直接增加成员变量,但可以通过关联对象实现类似功能。可以添加方法实现属性功能。 16. **向nil对象发送消息**:发送消息给nil是安全的,不会引发异常,返回值通常是`nil`或0。 17. **hook方法**:可以使用Runtime的`method_exchangeImplementations`或Category来替换方法的实现,实现hook。 18. **SEL、Method、IMP**:`SEL`是方法选择器,标识方法;`Method`封装了方法的所有信息;`IMP`是方法的实现,是个函数指针,执行方法的实际代码。 以上内容涵盖了Objective-C的基础和Runtime的核心机制,对于iOS开发者来说,理解并掌握这些知识点至关重要。在面试或实际开发中,熟练运用这些知识能够解决许多问题。