ARC规则
同一个程序中按文件单位可以选择ARC有效或无效(clang3.0以上)
所有权修饰符
__strong 修饰符是id类型和对象类型默认的所有权修饰符,源代码中的id变量,实际都被附加了所有权修饰符
** __weak** 弱引用不能持有对象实例
id __weak obj = [ [NSObject alloc] init];
obj上附加__weak修饰符 编译器会发出警告,变量obj持有对持有对象的弱引用,因此,为了不以自己持有的状态来保存自己生成并持有的对象,生成的对象会立即被释放。
{
id __strong obj0 = [[NSObject alloc] init];
id __weak obj1 = obj0
obj1持有obj0对象的弱引用
}
将__strong修饰符变量赋值给__weak修饰的变量 就不会警告 obj1持有ojb0的若引用
__weak修饰符还有另一个优点。在持有某对象的若引用时,若该对象被废弃,则此若引用将自动失效且处于nil被赋值的状态(空弱引用)
id __weak obj1 = nil;
{
id __strong obj0 = [[NSObject alloc] init];
obj1 = obj0;
NSLog(@"A:%@",obj1);
}
NSLog(@"A:%@",obj1);
__unsafe_unretained iOS4 是不安全的所有权 修饰符。跟__weak相似但不安全,尽量用__weak代替 尽管ARC式的内存管理是编译器的工作,但附有__unsafe_unretained修饰符的变量不属于编译器的内存管理对象。
__autoreleasing ARC下 @autoreleasepool块代替NSAutoreleasePool类
屏幕快照 2017-02-05 下午5.11.53.png
***ARC使用规则 ***
屏幕快照 2017-02-05 下午5.34.19.png
Foundation与Core Foundation
屏幕快照 2017-02-05 下午5.39.12.png
将NSMutableArray对象作为Core Foundation对象来处理
CFMutableArrayRef cfObject = NULL
{
id obj = [[NSMutableArray alloc] init];
cfObject = CFBridgingRetain(obj);
CFShow(cfObject);
printf("retain count = %d\n",CFGetRetainCount(cfObject));
}
printf("retain count after the scope= %d\n",CFGetRetainCount(cfObject));
由此可知,Foundation框架的API生成并持有的Objective-C对象能够作为CoreFoundation对象来使用,也可以通过CFRelease来释放。当然,也可以使用__bridge_retained转换来替代CFBridgingRetain。
__bridge转换不改变对象的持有状况,所以并不安全
属性修饰符
屏幕快照 2017-02-06 上午9.16.32.png
注意 copy属性不是简单的赋值,而是通过NSCopying协议的copyWithZone:方法赋值赋值源所生成的对象