assign,weak,retain,strong,copy属性浅谈

      assign,retain,strong,weak,还有copy,这些都是一个property在声明中可以指定的属性,且都与内存管理有关。相信很多刚刚接触OC的朋友,对这些属性的引用有时还是会存在一些困惑。今天在这里主要讲讲我对这些属性的理解。

首先,我们先来谈谈对property的理解。我们通常所说的property不是一个对象,它的表现形式主要有两种:

       1:代表一个简单数据类型,

       2:代表一个表现对象的指针(注意:这里说的是指针,而不是对象).

       assign:这是property的一个默认属性。用于 ‘基本数据类型’、‘枚举’、‘结构体’ 等非OC对象类型,比如int,float,bool等。如果这个属性被应用于一个指向对象的指针,那么当这个指针指向对象时,对象的引用计数是没有发生变化的,也就是说这个用assign修饰的property不能持有这个对象(感觉是不是和weak弱引用挺像的,不过weak引用会自动归置为nil),当对象在某个地方被释放了,这时的property可能就会成为一个悬垂指针,我们访问它指向的内存地址时,可能就会出现一些意想不到的状况。

        retain:用来修饰对象的指针在MRC时使用(和strong类似)。

        strong:OC对象类型(NSArray、NSDate、NSNumber、模型类),一个对象只要有强指针引用着,就不会被销毁 ,也就是我们经常说的强引用。指向对象的指针会被重新拷贝一遍,原对象的内存地址没有发生变化,引用计数+1,通俗点的理解就是指针拷贝(引用场景:类似于一条被牵着的狗,你用strong修饰一下,就相当于给这只狗又加了一条绳子,但是狗还是那条狗)。

         copy:一般用在NSString*类型、block类型上。指向的对象会被重新拷贝一遍(即会重新分配一个内存地址),并给这个新建的对象引用计数设置为1,通俗点的理解就是对象拷贝(引用场景:类似于重新创造了一只狗,并给这只狗套上了一条绳)。

         weak:弱引用(一般应用: UI控件,代理).类似于assign。对象销毁之后会自动置为nil,防止野指针。指向对象时,对象的引用计数不改变,即property不能持有这个对象。(引申:默认情况下,一个指针都会用__strong属性,表明这是一个强引用。那么只要引用存在,对象就不会被销毁。但是如果所有的strong类型的指针都消失以后,对象就会被释放掉,即使该对象还有__weak类型的指针指向它。同时清除掉所有剩余的weak指针。)

          这里有一个很有趣的例子(也是网上看来的)分享给大家来加深一下理解:

          strong类型的指针就是像是拴住的狗,只要你用绳子拴住狗,那么狗就不会跑掉。如果有5个人都牵着这一条狗(5条绳子牵一只狗),类比为5个strong类型指针指向一个对象。除非5个绳子都脱落,否则狗是不会跑掉的,类比,5个strong指针都=nil,则该对象释放。

           weak型指针就像是一个小孩子指着狗喊道:“看,有一只狗在那里”,只要狗一直被拴着,那么小孩子就能看到狗 (weak指针)会一直指向它,只要狗的绳子脱落,那么狗就会跑掉,不管有多少的小孩在看着它。

           以上说了那么多,主要是对各种属性的理解。那么接下来会和大家说一些我们经常所需考虑的问题;

           1:strong和copy的使用

           上面也说了strong和copy的区别分别是指针拷贝和对象拷贝。所以我们在使用这两种属性时要考虑到是否需要对象的值变问题。比如我们经常所使用的Model,可能它会同时被多个对象进行引用。如果我们用strong来修饰的Model,那么就可能会造成当我们在A对象改变model成员变量值时,B对象的model成员变量值也会发生改变。所以这个时候选择copy修饰就不会出现这种问题了(需要实现copyWithZone方法)。

            2.strong和weak的使用

            所有的引用计数系统,都存在循环应用的问题。例如下面的引用关系对象:a创建并引用到了对象b.对象b创建并引用到了对象c.对象c创建并引用到了对象b.这时候b和c的引用计数分别是2和1。当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1,b不会被释放。b不释放,c的引用计数就是1,c也不会被释放。从此,b和c永远留在内存中,造成内存浪费。这种情况,必须打断循环引用,通过其他规则来维护引用关系。这个时候当c引用b时就可以使用weak来避免循环问题。

            总的来说,OC的内存管理机制就是要保证引用计数平衡,当对象释放时使引用计数为0,大于零则会造成内存泄漏。

http://ios.jobbole.com/87649/

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

推荐阅读更多精彩内容