如果需要持有一个对象,那么对其发送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了,不然始终是一个指向不存在的地址,使用到的时候要崩溃)