ARC有效时,所有权修饰符一共有4种:
* __strong 修饰符
* __weak 修饰符
* __unsafe_unretained 修饰符
* __autoreleaseing 修饰符
__strong 修饰符
__strong修饰符是id 类型和对象类型磨人的所有权修饰符。 id obj = [[NSObject alloc] init]; 此时的id变量已经被附加了所有权修饰符。
id 和对象在没有指定所有权修饰符时,默认使用__strong 修饰符。 如 id _strong obj = [[NSObject alloc] init];
如“strong”这个名称所示,__strong 修饰符表示对对象的“强引用”。
{
id __strong test = [[Test alloc] init];
/** test 持有 Test 对象的强引用*/
[test setObject: [[NSObject alloc] init]];
/** test 对象的objc_ 成员,持有 NSObject 对象的强引用。*/
}
/**因为test 变量超出其作用于,强引用失效,所以自动释放test 对象。
*Test对象的所有者不存在,因此废弃该对象。
*废弃test对象的同时,Test 对象的 obj_ 成员也被废弃,NSObject 对象的强引用失效,自动释放NSObject 对象。
*NSObject 对象的所有者不存在,因此废弃该对象。*/
因为 id 类型和 对象类型的所有权修饰符都默认为 __strong 修饰符,所以不需要写上 "__strong"。
__weak修饰符
解决引用计数式内存管理中的“循环引用”问题。
使用 __weak 修饰符可避免循环引用。__weak 修饰符提供的是弱引用,弱引用不能持有对象实例。
循环引用容易发生内存泄漏。所谓内存泄漏就是应当废弃的对象在超出其生存周期后继续存在。
附有__strong 修饰符 、 __weak修饰符的变量类似于C++中的只能指针 std::shared_ptr 和 std::weak_ptr。 std::shared_ptr 可通过引用计数来持有C++类实例,std::weak_ptr 可避免循环引用。
规则
* 不能使用 retain/release/retainCount/autorelease
* 不能使用NSAllocateObject/NSDeallocateObject
* 须遵守内存管理的方法命名规则 (以init开始的方法的规则要比alloc/new/copy/mutableCopy更严格。该方法必须是实例方法,并且必须要返回对象。返回的对象应为id类型或者该方法声明类的对象类型,亦或是该类的超类型或子类型。)
* 不要显式调用dalloc(无ARC是否有效,只要对象的所有者都不持有该对象,该对象就被废弃。对象被废弃时,不管ARC是否有效,都会调用对象的dealloc方法。)
* 使用 @autoreleasepool 块代替 NSAutoreleasePool
* 不能使用区域(NSZone)
* 对象型变量不能作为C语言结构体(struct/union)的成员
* 显式转换“id”和“void”
网友评论