Objective-C高级编程:ARC

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使用规则 ***

Objective-C高级编程:ARC_第1张图片
屏幕快照 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转换不改变对象的持有状况,所以并不安全
属性修饰符

Objective-C高级编程:ARC_第2张图片
屏幕快照 2017-02-06 上午9.16.32.png

注意 copy属性不是简单的赋值,而是通过NSCopying协议的copyWithZone:方法赋值赋值源所生成的对象

你可能感兴趣的:(Objective-C高级编程:ARC)