问题描述
- iOS 内存管理里面的 property 的语义属性
- iOS 内存管理里面的 property 的语义属性为retain时,它的内部做优化时,为什么最后又把新的实例变量再retain一次。
setter方法
if(_name != name){
[ _name release]
_name = [name retain];
}
解决方案
property定义属性时,用retain等去修饰,其实就是再set方法里面进行相应处理,定义的retain就是告诉系统在set里面使用retain赋值。
解决方案二:
你那个name属于现在一个新的对象,它指向一块内存,引用计数的原理就是去标记一块内存有几个对象指向它,当没对象指向他的时候引用计数等于0,然后调用dealloc方法,所以当你的name申请的时候count = 1,这时name指向这块内存,然后你又把这块内存的地址给了_name,此时_name也指向了这块内存,所以这块内存的count应该加1等于2,所以通过retain让他加到2
解决方案三:
遵循内存管理的原则:
1. 谁 alloc 了,谁负责 release
2. 谁 retain 了,谁负责 release
你重写 set 方法,遵循的就是第二条原则
因为需要对上一个变量 release,所以引用的时候需要 retain 一下
解决方案四:
不要被名字迷惑了,实际上这里release的是name这个property指向的旧对象,retain的是新对象。
解决方案五:
现在大多数都用ARC,声明成strong,调用不了retain了
时间: 2024-10-31 08:47:59