Objective-C(OC)的内存管理机制主要是通过引用计数来实现的。当一个对象的引用计数为0时,它会被销毁。`retain`用于增加对象的引用计数,而`release`用于减少引用计数。通常情况下,与`retain`配对使用的是`release`,因为当你调用`retain`增加了一个对象的引用计数,你需要在不再需要该对象时通过`release`来减少引用计数,以确保对象在适当的时间被销毁。与`alloc`配对使用的方法也是`release`,因为在调用`alloc`创建新对象时,其引用计数初始化为1,之后需要在适当时候通过`release`来释放内存。
属性关键字在Objective-C中扮演着重要的角色,它们定义了实例变量的行为。以下是这些关键字的解释:
- `readwrite`(默认):属性既有getter又有setter方法,允许读写。
- `readonly`:只有getter方法,不允许外部修改值。
- `assign`:简单赋值,不进行内存管理,适用于非Objective-C对象或基本数据类型。
- `retain`:setter方法会保留新值并释放旧值,适用于Objective-C对象,相当于ARC中的`strong`。
- `copy`:创建新对象的副本并保留,适用于需要确保对象不可变的情况。
- `nonatomic`:非原子性,不保证setter和getter的线程安全性,通常更快,是默认选项。
- `atomic`:原子性,确保setter和getter的线程安全,但可能较慢。
- `strong`(ARC下默认):与`retain`类似,但在ARC环境中使用。
- `weak`(ARC下):弱引用,不增加对象的引用计数,当对象被释放时自动设为nil,防止野指针。
iOS提供了多种实现多线程的方法。其中,`NSThread`是最轻量级的多线程方法,使用起来最直观的多线程编程方法。但是因为需要自己管理线程的生命周期,线程同步,经常使用NSThread进行调试,在实际项目中不推荐使用。其他几种方法包括:
1. `GCD(Grand Central Dispatch)`:苹果提供的低级并发工具,基于C语言,更高效。`dispatch_async`用于在全局队列或自定义队列上异步执行任务。
2. `NSOperationQueue`:队列管理操作,支持并发执行和依赖关系,可以使用`addOperationWithBlock:`添加异步任务。
3. `NSOperation`:对象级别并发,可以在同一个对象上添加多个异步任务,并且这些任务之间可以存在依赖关系。