Objective-C底层知识:通知、属性关键字与分类

需积分: 0 0 下载量 139 浏览量 更新于2024-08-05 收藏 224KB PDF 举报
"这篇文章除了OC底层面试题还包括了通知、属性关键字、分类、扩展和代理(Delegate)的相关知识。" 在iOS开发中,Objective-C(OC)的底层面试题涵盖了多个核心概念,包括如何使用NSNotification进行跨层通信,属性关键字的详细解释,以及类别(Category)、扩展(Extension)和代理模式的应用。 1. **通知(NSNotification)** - 通知是一种基于观察者模式的设计,用于在不同组件之间传递信息。它支持一对多的通信,意味着一个通知可以被多个观察者接收。 - 实现通知机制通常涉及服务提供商向Apple的APNs服务器发送消息和设备令牌,APNs随后将消息推送给对应的设备,最后由设备上的应用程序处理并展示通知。 2. **属性关键字** - **读写权限**:`readonly` 和 `readwrite`,其中`readwrite`是默认的,允许读写操作。 - **原子性**:`atomic` 和 `nonatomic`。`atomic`提供了线程安全的读写,但不是绝对安全,特别是在处理复杂操作时。`nonatomic`效率更高,但不保证线程安全。 - **引用计数**:`retain/strong`、`assign`、`weak` 和 `copy`。 - `retain/strong`会增加对象的引用计数。 - `assign`常用于基本数据类型,修饰对象时可能导致悬垂指针问题。 - `weak`在对象被释放后自动设为`nil`,避免悬垂指针。 - `copy`涉及浅拷贝和深拷贝,浅拷贝复制内存地址,深拷贝复制内容。对于可变与不可变对象,`copy`和`mutableCopy`会有不同的行为。 3. **分类(Category)** - 分类常用于声明私有方法,分割大类文件,或公开框架中的私有方法。 - 分类的特点在于运行时决议,可以为系统类添加新的方法。 4. **扩展(Extension)** - 扩展主要用来声明私有属性和方法,它在编译时决议,通常存在于宿主类的`.m`文件中。 - 扩展不能为系统类添加新的成员变量,只能扩展类的内部结构。 5. **代理(Delegate)** - 代理是一种设计模式,让一个对象代表另一个对象来执行某些任务,通常用于实现对象间的通信。 - 在OC中,定义代理通常使用`@protocol`,然后在类中设置代理属性并遵循协议。 面试中,理解这些基本概念及其用法是至关重要的,它们涉及到代码的性能、线程安全以及不同组件间的协作。例如,对于`NSMutableArray`使用`copy`属性会导致不可变对象,如果尝试进行可变操作,会导致程序崩溃。因此,正确理解和使用这些特性对于编写健壮的iOS应用至关重要。