iOS编程

iOS开发---ARC

2019-08-18  本文已影响0人  祀梦_

什么是ARC?

概述

所有权修饰符

__strong修饰符

ARC下自己生成并持有对象的源代码

 id __strong obj = [[NSObject alloc] init];

//源码实现如下
{
  //自己生成并持有对象
  id __strong obj = [[NSObject alloc] init];
  //因为变量obj为 强 引用,所以自己持有对象
}
//变量obj超出其作用域,强引用失效
//自动释放持有的object对象
//对象的所有者不存在,因此废弃该对象

ARC下非自己生成并持有的对象

id __strong obj = [[NSMutableArray alloc] init];

//源码实现如下
{
    //取得非自己生成并持有的对象
  id __strong obj = [[NSMutableArray alloc] init];
  //因为变量obj为强引用,所以自己持有对象
 
}
//因为变量超出其作用域,强引用失效
//所以自动释放自己持有的对象
//对象的所有者不存在,因此废弃该对象

__strong修饰符的变量之间相互赋值

id __strong obj0 = [[NSObject alloc] init];//对象A
//obj0持有对象A的强引用

id __strong  obj1 = [[NSObject alloc] init];//对象B
//obj1持有对象B的强应用

id __strong obj2 = nil;
//obj2不持有任何对象

obj0 = obj1;
//obj0持有由obj1持有的对象B的强引用
//因为obj0被赋值,所以原先持有对象A的强引用失效
//对象A的所有者不存在,因此废弃对象A
//此时,持有对象B的强引用的便利那个为obj0和obj1

obj2 = obj0;
//obj2持有由obj0持有对象B的强引用
//此时持有对象B的强引用的变量为obj0、obj1、obj2

obj1 = nil;
//因为nil被赋值给obj1,所以obj1对对象B的强引用失效
//此时,持有对象B的强引用的变量为obj0、obj2

obj0 = nil;
//因为nil被赋值给obj0,所以obj0对对象B的强引用失效
//此时,持有对象B的强引用的变量为obj2

obj2 = nil;
//因为nil被赋值给obj2,所以obj2对对象B的强引用失效
//此时对象B的所有者不存在,因此废弃对象B

__weak修饰符

循环引用

__weak

__unsafe_unretained修饰符

__autoreleasing修饰符

ARC有效修饰符和ARC无效方法比较

非显示使用__autoreleasing修饰符

通过方法名使用
访问附有__weak修饰变量时

@autoreleasepool

ARC规则

init方法

显示转换id和void*

上一篇下一篇

猜你喜欢

热点阅读