__Strong  __weak  __autorelease  __unsafe_unretained _copy 关键字的本质和用法

1.__Strong  ARC 无效时,引用计数器加1,当超出作用域,引用为nil,由于未执行release 方法,对象还存在堆中,而此时引用销毁了,对象没有销毁,出现内存泄漏

ARC 有效时,引用计数器加1,当超出作用域,当系统判断引用为nil时,系统自动销毁对象。

ARC 情况下

2.__Weak  ARC 不持有对象,自动加入自动释放池autorelaesepool;

(1.)不持有对象,

例如 id __weak obj = [[ NSObject alloc ]init];系统警告,发现是以__weak 修饰的引用obj 系统会在创建好对象后,自动release掉。

(2.)自动加入自动释放池

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

id __weak obj1=obj;{

伪代码如下:id__weak obj1 = obj,

id _autoreleasing tmp = obj1;    (加入自动释放池)

}

obj超出作用域,引用为nil,同时obj1引用为nil,(对象是否销毁要看系统什么时候销毁自动释放池,此时只是两个引用为nil)自动释放池此时持有对象,自动释放池销毁时销毁对象(系统在合适的时机销毁自动释放池)这个合适的时机就是当前的RunLoop循环结束。

3.__autorelease 将对象放入自动释放池,系统在合适的时机销毁自动释放池,同时销毁池内的对象。

4.__unsafe_unretained 不安全的所有权修饰符,如果用__unsafe_unretained 修饰的引用指向对象系统报错,同__weak,  例如 id __unsafe_unretained obj = [[ NSObject alloc ]init];系统  警告,

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

id __unsafe_unretained obj1=obj;

obj 赋值给obj1,既不持有对象的强引用,也不持有对象的弱引用,当obj 超出作用域时,引用对象销毁,obj为nil,obj1为野指针。

ARC

1.__strong 的具体实现

id obj(默认strong)=  [[ NSObject alloc ]init];

id obj = objc_msgSend(NSObject,@selector(alloc));

objc_msgSend(obj,@selector(init));

当超出obj 的作用域时自动销毁

2.__weak 的具体实现

id obj(默认strong)=  [[ NSObject alloc ]init];

赋值为nil

id __weak obj1 = obj

obj1 = 0;

objc_storeWeak(&obj1,obj)

objc_storeWeak(&obj1,o)

(把第二参数的地址作为键值,将对参数的附有__weak 修饰符的变量注册到weak 表中,如果第二参数为0,记obj超出作用域或者obj为nil 则把变量地址从weak 表中删除,将obj1赋值为nil)

注册到自动释放池

objc_initWeak (&obj1,obj);

id temp = objc_loadWeakRetained(&obj1) (引用计数加1)

objc_autorelease(temp);

系统发现用__weak 修饰时通过 objc_loadWeakRetained 函数取出__weak 修饰符变量所引用的对象retain,然后放入自动释放池,objc引用超出作用域,指针销毁,obj1销毁,对象等自动释放池释放时销毁。


5copy 

copy 分为三种情况

1.当修饰,NSMutableString NSMutableArry 等可变的字符串或者数组时,必须用copy,因为strong 是单纯增加对象的引用计数,改变的同时会同时改变源对象,而copy 是做的深拷贝,改变对象的同时,对源对象没有影响,所以必须用copy。

2.当修饰不可变字符串或者数组,字典时分为两种情况


1.当传入的对象也为不可变对象时,用copy和strong 没有区别,例如

1.

NSString *textStr = @“TextString”;

self.StrStrong = textStr;

self.strCopy   =textStr;

当textStr 的值改变时,self.StrStrong或者self.StrStrong 的值并不会因为textStr的值改变而发生改变,因为不可变字符串在代码区,例如当textStr = @“TextString” 时,textStr 指向的是TextString 的首地址,而当textStr = @“TextString1”,textStr 指向的是TextString1 的首地址

记当textStr = @“TextString”;self.StrStrong = textStr;self.StrStrong = strCopy;时,他们三个的地址都是指向“TextString”的首地址,当self.StrStrong = @"TextChange" 时,textStr和self.strCopy还是指向TextString,所以他们三个当中任意一个的值改变都不会影响到对方,所以用Strong和copy 没有任何区别.

2.

NSMutableString *textStr =  [NSMutableString stringWithString:@"textStr"];

self.StrStrong = textStr;(指向的是对象textStr,强引用,引用计数器加1)

self.strCopy= textStr;(对对象textStr 的一次深拷贝)

当textStr 的值改变时,self.StrStrong 的值会发生改变因为self.StrStrong和textStr指向的是同一个对象,而self.strCopy对textStr做的是深拷贝,所以值不会发生改变。所以在进行赋值操作时如果接收的对象是可变对象,也必须用copy。

注意:因为在进行赋值操作时,我们并不能确定传递的是可变字符串、字典、数组,还是不可变字符串、字典、数组。所以我们应该统一用copy 这样就可以避免出现对象改变的情况,bug出现的几率会大大降低,所以建议不管是可变不可变时都统一用copy

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • 1.1 什么是自动引用计数 概念:在 LLVM 编译器中设置 ARC(Automaitc Reference Co...
    __silhouette阅读 5,158评论 1 17
  • 前言 从我开始学习iOS的时候,身边的朋友、网上的博客都告诉我iOS的内存管理是依靠引用计数的,然后说引用计数大于...
    盖世英雄_ix4n04阅读 554评论 0 1
  • 自动引用计数 自动引用计数:指内存管理中对引用采取自动计数的技术。 内存管理/引用计数 持有对象引起引用计数加...
    南京小伙阅读 1,313评论 2 3
  • 天空中,风雨交加。 我来到我表弟家。我的表弟头发垂在头上。大大的眼睛,小小的鼻子,小小的嘴,皮肤嫩嫩的,耳朵仿佛能...
    张墨涵阅读 154评论 4 2
  • 1.为什么我有玉米 2.为什么蟑螂吃玉米 3.为什么我的玉米被蟑螂吃了 1.因为我想吃,那天就买了,如果我没买,我...
    Lexynna阅读 2,695评论 0 0