访问方法中的保留和释放:
最好的方法设置的原则是(保持新的释放旧的,谁拥有对象谁就负责释放对象)
- (void ) setEngine : (Engine *) newEngine
{
[newEngine retain] ;
[engine release] ;
engine = newEngine;
}请问,其中[newEngine retain] ;[engine release] ; 如何理解?
解决方案 »
- mac系统的pc端软件开发!!
- cocosbuilder3.0加载一个工程后左侧project区域内为什么不显示任何文件目录?
- Objective-C编程之道iOS设计模式子类化单例疑惑
- 关于block的很诡异的问题
- 提交审核版本失败。不知道如何是好
- AAC音频文件 转nsdata 完后转 byte 为空 tcp 传输
- 本机进程通信tcp延迟长
- iOS8.1地图百度地图坐标转高德地图坐标出现偏差,求大神~~~
- 有在iOS上使用vtk的同学吗?
- AFNetworking如何将responseObject传递出来?
- 在tableviewcontroller的顶部增加了一UINavigationBar,如何能固定在屏幕顶部不随着table列表滚动?
- UITabBarController的orientation问题。
若你先release,「然后」才retain,你会把自己给解构(destruct,相对于建构)!这就是为什么应该要
1) retain 2) release 3)设值的原因。那现在我们还需要release么,是对engine还是对newEngine进行release,或者两者效果是一样的呢 ?
[c retain];//---1
[city release];//---2
city=c;//---3
}
在JAVA 这种使用GC 机制的语言中,我们只需要写第三条语句。其实Object-C 中你也可以
只写第三条语句,我们管这种方式获得的city 叫做弱引用,也就是city 只是通过赋值操作,
把自己指向了c 指向的对象,但是对象本身的引用计数器没有任何变化,此时city 就要承担
[c release]之后所带来的风险,不过有些情况下,你可能确实需要这种弱引用。这里你需要
注意的是有些文档把这种弱引用叫做assign(指派,这很形象,把一个指针直接指派到另一
个指针指向的对象,但不拥有这个对象)方式,强引用叫做retain 方式。
当然,大多数情况下,我们使用的都是强引用,也就是使用第一行代码首先retain 一下,使
引用计数器加1,再进行赋值操作,再进一步说就是先通过retain 方法拿到对象的拥有权,
再安全的使用对象。
city 进行一次release,而直接把city 指向c 指向的对象,那么city 原来指向的对象可能会出
现内存泄漏,因为city 在改变指向的时候,没有将原来指向的对象的引用计数器减1,违反
了你retain 对象之后,要在恰当的时刻release 对象的要求。
第三行代码毋庸置疑的要在最后一行出现,但按照前面的阐述,貌似第一行、第二行的代码
是没有先后顺序的,也就是可以先[city release],再[c retain],但真的是这样吗?有一种较为
少见的情况,那就是把自己作为参数赋给自己(这听起来很怪),也就是说参数c 和成员变
city 是一个指针变量,那么此时如果你先调用[city release],就会导致对象的retainCount 归0,
对象被dealloc 了,那么[c retain]就会报错,因为对象没有了。
综上所述,上面所示的三行代码是比较好的组织方式。但其实你可能也会看到有些人用其他
的方式书写setter 方法,这也没什么好奇怪的,只要保证对象正常的使用、回收就是没有问
题的代码。
if (newValue !=myField) {
[myField release];
myField = [newValue retain];
}
}