assign,copy,retain ,weak,strong(二)

来源:互联网 发布:海岛奇兵 步兵升级数据 编辑:程序博客网 时间:2024/04/28 21:11

如果需要持有一个对象,那么对其发送retain 如果之后不再使用该对象,那么需要对其发送release(或者autorealse) 每一次对retain,alloc或者new的调用,需要对应一次release或autorealse调用

什么时候retain

例如:person是一个类在vc声明了属性person1和person2@property (nonatomic,strong) person *person1;self.person1 = [[person alloc]init];//在alloc的时候开辟了一个内存地址  OXOOOOOOea3  来存储person1这个指针,此时OXOOOOOOea3的引用计数 retainCount = 1,这个1代表有一个指针指向OXOOOOOOea3这块内存此时添加一句代码self.person2 = self.person1;//注意了,不是person1的值给person2,而是声明了一个person的类型指针person2 也指向了person1的内存地址//此时 OXOOOOOOea3的retainCount +1 = 2,代表OXOOOOOOea3这个内存地址有两个指针在指向这块内存,这就是引用计数的原理//换句话说,只要有一个新的指针指向OXOOOOOOea3内存地址,那么它的引用计数retainCount就+1,这时候person1使用完了,需要释放,在mrc的时候需要写[self.person1 release];//这时候OXOOOOOOea3的引用计数retainCount-1=1//现在OXOOOOOOea3还有一个指针指向它,它并不会消失现在person2也使用完毕了,arc也会帮我们插入一条[person2 release];//这时候person2这个指针指向的内存OXOOOOOOea3  retainCount-1=0,代表已经没有指针指向这块内存地址了//那么ok,OXOOOOOOea3内存释放

什么是strong

上面讲到mrc OXOOOOOOea3内存地址的引用计数,通过retain来增加。

  • 在oc的arc中,strong 又称为强引用,换一句贴切点的strong就是指针,strong声明的都是需要指向某一块内存地址的指针,说三次,strong是指针,strong是指针,strong是指针。
  • 所以当你声明的strong对象从内存中创建的时候会插入mrc的retain,来让你指向的内存地址 引用计数retainCount+1
  • 什么又是强引用?,只要strong声明的指针 指向这个内存地址,一直指这它,那么这个块内存地址就不会被释放
  • 除非指向的内存 引用计数retainCount=0或者超出了你声明指针的作用域,比如你在vc2声明person2,返回到vc1,那么vc2会delloc,所有vc2将会从该内存中移除。
    这就是强引用

什么是weak

举个例子加深理解,

  • 小明找到了一个很漂亮的女朋友小花
  • 小明和小花是恋人关系,并且小花说了,只爱小明一个只要小明不爱她了,她就跳楼,strong
  • 小军也喜欢小花,做不成恋人就做闺蜜吧,嗯weak,就只能看看而已
  • 真的有一天小明变心了,爱上了如花,小花伤心欲绝,跳楼而死。从此小军再也见不到小花了。(小花retainCount-1=0)

//解释一下,此时小花这个内存只有小明这个strong指针指向,同时能被weak指针看到,当小明不再指向小花,小花此时没有指针指向它,从内存杀死了,当然小军weak就再也看不到了

什么是copy

继续上面的故事,结局不一样了

  • 小明strong一直深爱着小花(内存)
  • 官二代小军copy出现,说了,他一定要得到小花,不惜一切代价。
  • 小明没办法,只有让了,照着小花的真人模样做了一个硅胶娃娃送给了小军。
  • 此时小军….

小花是内存,做的娃娃是另一个内存,容易懂吧

什么是assign

一样的故事。。。

  • 小明strong和小花快乐的玩耍着
  • 土匪小军assign出现 ,说了,他一定要得到小花,不惜一切代价。
  • 这次小军不喜欢娃娃了,直接掳走了小花,但是小花心里只装着一个人就是小明,心中未曾多个人,引用计数retainCount不加1,还是1,小明和小花还是一对恋人
  • 小花茶饭不思,不久GG思密达上天了(retainCount-1=0)
  • 小明从此注孤生置为nil
  • 小军已经入了魔,天天还是与小花的空壳在一起,还爱着小花,此时小花已经死去。是该把小军送进精神病院了(该把它置为nil了,不然始终是一个指向不存在的地址,使用到的时候要崩溃)
1 0
原创粉丝点击