Objective-C学习之ARC的实现方法
什么是ARC
ARC (Automatic Reference Counting)自动引用计数是Apple公司在2011年WWDC发表的一项新技术。在ARC下,开发者不再需要手动管理Objective-C对象的内存,用过的对象会自动通过引用计数释放,减轻了代码的负担,并且更容易保持代码的正确性。
ARC的实现方法
1. 引用计数的基本实现
Objective-C基于引用计数计算机制,它通过维护对象引用计数器,来判断对象是否应该被释放。引用计数器初始化为1,每次通过copy方法拷贝引用,都会将计数器加1,而每使用一次autorelease方法,引用计数器都会递减1。当计数器递减到0时,即代表对象不再被需要,会自动释放内存。 注意:autorelease只是个标识符,实际是顺延到下一次RunLoop循环再进行autorelease操作。
2. 定义strong、weak、assign三种属性关键字的作用
在ARC下,定义property属性时需要根据业务需求选取合适的属性关键字,强调对象和ARC的内存管理关系。有三种常用的关键字:
- strong:表示强引用,对象会被强引用计数器加1,而且会实时释放。
- weak:表示弱引用,对象会被弱引用计数器保留,当它没有强引用计数器时会无条件释放。(ARC下,weak修饰的对象若引用计数为0则系之释放)
- assign:表示指针变量进行赋值,同样是对象引用计数器的一个指针,但是不会对计数器进行加1操作,不会改变该对象的生存周期。
参考示例:
// strong示例
@property(strong, nonatomic) NSString *strongStr;
[self setStrongStr:[[NSString alloc] initWithString:@"Hello world!"]];
// weak示例
@property(weak, nonatomic) id weakObj;
SomeObj *obj = [[SomeObj alloc] init];
[self setWeakObj:obj];
// assign示例
@property(assign, nonatomic) NSInteger integerValue;
[self setIntegerValue:100];
3. block的内存管理
Block在ARC下会自动地对变量进行复制到堆上,并自动定义为strong属性。因此,我们在定义block时,一般选择使用声明为__weak的self,以避免循环引用问题。
参考示例:
__weak typeof(self) weakSelf = self;
[self someMethodWithCompletion:^{
// 使用弱引用的weakSelf会更安全
[weakSelf doSomething];
}];
总结
ARC是一个优秀的技术,需要我们逐渐了解并掌握其相关知识,可以大幅减轻程序员的负担,更专注于业务逻辑的实现,同时减少出错的几率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Objective-C学习之ARC的实现方法 - Python技术站