ARC新规:
1. 禁止调用dealloc(但可以重新实现)
2. 禁止实现、调用 release,retain,retainCount,autorelease。
3. 禁止release instance variables。
4. You can still use CFRetain, CFRelease, and other related functions with Core Foundation-style objects。
5. 禁止使用 NSAllocateObject, NSDeallocateObject。
6. You create objects using alloc; the runtime takes care of deallocating objects.
7. You cannot use object pointers in C structures(use Objective-C class to manage the data instead)。
8. 禁止使用 NSAutoreleasePool (use @autoreleasepool blocks instead)。
9. 禁止使用memory zones(如NSZone)。
10. 强制命名规范:成员变量不准以new开头,除非指定了新的getter(如 @property (getter=theNewTitle) NSString *newTitle;)。
ARC引入新的Property Attributes:strong,weak
1. @property(strong):相当于@property(retain)。
2. @property(weak):相当于@property(assign),只不过当所指对象被销毁时,weak指针会被自动置为nil。
ARC引入了新的Variable Qualifiers:
1. __strong:默认的Qualifier,会保证所指对象是alive的。
2. __weak:不保证所指对象是alive的,而且所指对象被销毁时,__weak指针会自动被置为nil。
3. __unsafe_unretained:和 __weak 一样,但不会被自动置为nil(所以有可能变为野指针)。
4. __autoreleasing:用来说明传进来的参数是指针传递的(最常见的是定义一个 NSError* error,然后以 &error 的形式传递给某个函数),并且返回的对象是 autoreleased。
例子:
MyClass * __weak myWeakReference;
MyClass * __unsafe_unretained myUnsafeReference;
ARC编译器开关:
大开ARC:-fobjc-arc
关闭ARC:-fno-objc-arc
1. 禁止调用dealloc(但可以重新实现)
2. 禁止实现、调用 release,retain,retainCount,autorelease。
3. 禁止release instance variables。
4. You can still use CFRetain, CFRelease, and other related functions with Core Foundation-style objects。
5. 禁止使用 NSAllocateObject, NSDeallocateObject。
6. You create objects using alloc; the runtime takes care of deallocating objects.
7. You cannot use object pointers in C structures(use Objective-C class to manage the data instead)。
8. 禁止使用 NSAutoreleasePool (use @autoreleasepool blocks instead)。
9. 禁止使用memory zones(如NSZone)。
10. 强制命名规范:成员变量不准以new开头,除非指定了新的getter(如 @property (getter=theNewTitle) NSString *newTitle;)。
ARC引入新的Property Attributes:strong,weak
1. @property(strong):相当于@property(retain)。
2. @property(weak):相当于@property(assign),只不过当所指对象被销毁时,weak指针会被自动置为nil。
ARC引入了新的Variable Qualifiers:
1. __strong:默认的Qualifier,会保证所指对象是alive的。
2. __weak:不保证所指对象是alive的,而且所指对象被销毁时,__weak指针会自动被置为nil。
3. __unsafe_unretained:和 __weak 一样,但不会被自动置为nil(所以有可能变为野指针)。
4. __autoreleasing:用来说明传进来的参数是指针传递的(最常见的是定义一个 NSError* error,然后以 &error 的形式传递给某个函数),并且返回的对象是 autoreleased。
例子:
MyClass * __weak myWeakReference;
MyClass * __unsafe_unretained myUnsafeReference;
ARC编译器开关:
大开ARC:-fobjc-arc
关闭ARC:-fno-objc-arc
注意:可以单独为某些文件指定该编译选项
后记:
遗憾的是,apple官方文档里只是简单的提及:对象的释放由系统接管(编译器在合适的地方安插release代码),并没有关于对象释放的更多细节(比如释放的规则,何时释放)。我也问过很多iOS开发者,他们对于代码是否有内存泄漏,基本都说不清楚,而且很多人都理直气壮的抱有一个观点:有ARC了你还管那么多干嘛?!非也,没问题的时候当然啥都好说,可一旦有问题,如果没有深层研究过,那靠什么去追查问题呢?我会在后续的博客披露更多关于对象释放的细节。