ARC 强制使用规则 ARC Enforces New Rules
1、不能显示的调用 dealloc 方法,不能重写 或者调用 relation ,release ,retain count,autorelease. 包括@selector(retain),@selector(release),等。你如果需要管理管理资源( 比如调用 setDelegate:nil )可以重写dealloc方法,但不要在 dealloc 里面 进行释放变量操作 也不要在dealloc方法里调用[super dealloc]因为 这条链是由编译器自动调用的 。
你仍然可以对Core Foundation 类型的 对象使用CFRetain,CFRelease和其他相关的函数(参考“Managing Toll-Free Bridging”). 参考: http://blog.youkuaiyun.com/xiaofei125145/article/details/38315409
2、不能使用NSAllocateObject orNSDeallocateObject。
创建对象时使用 alloc ; (You create objects usingalloc; the runtime takes care of deallocating objects.)
3、不能在C语言结构体内部使用 对象指针。你可以创建一个 Objective c 类来代替这个结构体。
4、不要随便的 把 id 转换为 void * ,或者 反向的转换。必须使用特定的转换方法 来告诉编译器对象的生命周期,你可以通过把 objective c 对象 转换为 Core Foundation 数据类型来实现。see“Managing Toll-Free Bridging.” 参考:http://blog.youkuaiyun.com/xiaofei125145/article/details/38315409
5、不能使用 NSAutoreleasePool 对象,arc 用 @autoreleasepool blocks 来代替。
6、不能使用 memory zones .
arc 中 再也用不着 NDZone, 它将要,永远的被modern Objective-C runtime 忽略。
7、变量命名限制,不要以 new 开头。
也就是说,不要声明 以 new 开头的 属性 ,除非 你给它制定了 其他的 getter 方法 如下:
// Won't work: 错误
|
@property NSString *newTitle;
|
|
// Works: 正确
|
@property (getter=theNewTitle) NSString *newTitle;
|
ARC Introduces New Lifetime Qualifiers
arc 引进了新的生命周期限定符
弱引用的概念: 弱引用不会延长所指向对象的生命周期,并且 当所指向的对象将要回收的时候,会自动指向 nil;
属性限定符: strong 是默认的 描述符
retain 应由 strong 代替
assai 应由 weak 代替
// The following declaration is a synonym for: @property(retain) MyClass *myObject;
|
@property(strong) MyClass *myObject;
|
|
// The following declaration is similar to "@property(assign) MyClass *myObject;"
|
// except that if the MyClass instance is deallocated,
|
// the property value is set to nil instead of remaining as a dangling pointer.
|
@property(weak) MyClass *myObject; |
变量限定符号:
_strong 默认的 ,只要有一个 strong 指针指向 ,对象就不会被释放 ,所以你声明函变量,如果是强应用的话,就可以什么限定符都不写。
| ||
__weak 不会影响对象的生命周期, 当对象 生命结束前 ,weak 指针会指向 nil
局部错误的写法: string 是 weak 类型 ,指向的 对象 没有 任何 强引用,所以 会 立刻释放 ,释放后 weak 会自动指向 nil ,所以打印结果是 string: null
| ||
__unsafe_unretained 与weak唯一的 区别就是不会指向 nil,比较危险 (当指向的对象被 回收后再 调用的话,就会出现异常 )
| ||
__autoreleasing 在 函数传参时使用 ,比如生命函数时 需要这样写 ,这样写函数返回时,error 会被自动释放。
-(BOOL)performOperationWithError:(NSError * __autoreleasing *)error;
|
(小插曲)编译器对代码的处理:(当传递参数时,如果穿进去的参数类型不符合 要求,编译器就会创建一个 临时变量 如下)
-(BOOL)performOperationWithError:(NSError * __autoreleasing *)error;方法AAAA声明。
编译器在编译时 会自动将下面代码处理为
NSError *error;
|
BOOL OK = [myObject performOperationWithError:&error]; // 调用方法 AAAA
|
if (!OK) {
|
// Report the error.
|
// ... |
NSError * __strong error;
|
NSError * __autoreleasing tmp = error;
|
BOOL OK = [myObject performOperationWithError:&tmp];
|
error = tmp;
|
if (!OK) {
|
// Report the error.
|
// ... |
arc 模式 下 ,在 方法内声明的 变量 如果类型为strong, weak, and autoreleasing ,编译器会 自动将 这些变量初始化为 nil ,
默认的为 strong; 所以下面打印结果为 name: null
- (void)myMethod {
|
NSString *name;
|
NSLog(@"name: %@", name); // name: null |
} |
关于 arc 的设置
-fobjc-arc 没有使用arc 的工程中 设置文件 用arc 编译compiler flag
-fno-objc-arc 使用了arc的工程中设置部分 file 不使用arc compiler flag
arc支持:
支持 ARC的Xcode版本为 Xcode4.2 及其以后版本 (xcode4.1以前的都不支持 arc )
支持ARC 的 iOS系统为 IOS4及其以后版本 (个人认为,使用arc的项目,也可以打出兼容 ios4.x的包)
支持ARC的 OSX 系统为 x10.6及其以后的版本(以后版本为 64位系统)
弱引用不支持 ios4 和 x10.6 系统。
(个人理解 __weak 这个限定符如果使用了的话,xcode 就不能打兼容ios4.x的包)