使用self. 导致的内存泄露
2014-11-17 09:30
204 查看
请看第一段代码:
在MyObject.m中
self.aObj = [[NSObject alloc] init];
...
...
- (void)dealloc{
[self.aObj release];
[super dealloc];
}
你能否看出这里的内存泄露?
接下来看第二段:
aObj = [[NSObject alloc] init];
...
...
- (void)dealloc{
[aObj release];
[super dealloc];
}
你能否看出这里是否也有内存泄露呢?
如果你都能够很确定的知道泄露的原因,那么下面的文字,你就不需要阅读了,找个养眼的图片,养养眼吧。相反,如果你不确定,那么,下面的内容就对你很有帮助。
首先给没看出来的同学普及@property生成的set和get方法的具体内容:
- (NSObject *)aObj{
return aObj;
}
- (void)setAObj:(NSObject *)newobj{
if(newobj != aObj){
[aObj release];
aObj = [newobj retain];
}
}
现 在,将第一段代码,带入到这个set方法中去,你就能发现 self.aObj = [[NSObject alloc] init];是一个永远不会被释放的对象,aObj这个对象所对应的指针在alloc的时候被retain了一次retainCount=1,在set方 法中又被retain了一次,所以retainCount=2,在dealloc方法中,只有一次release,所以,retainCount=1,这
个指针空间就不会被释放,而第二段代码中,并没有使用set方法,而是将 [[NSObject alloc] init];的指针付值给aObj这个变量。只有一次alloc。故在程序执行dealloc方法的时候,这个指针空间就可以被释放。
下面给大家一段正确使用和释放self.的例子
NSObject *newobj = [[NSObject alloc] init];
self.aObj = newobj;
[newobj release];
...
...
- (void)dealloc{
self.aObj = nil;//这样写显的很简洁
[super dealloc];
}
对于@property([copy|assign])这两种情况,大家可以参考这个链接的文章。 http://www.cocoachina.com/macdev/cocoa/2010/1015/2194.html
在MyObject.m中
self.aObj = [[NSObject alloc] init];
...
...
- (void)dealloc{
[self.aObj release];
[super dealloc];
}
你能否看出这里的内存泄露?
接下来看第二段:
aObj = [[NSObject alloc] init];
...
...
- (void)dealloc{
[aObj release];
[super dealloc];
}
你能否看出这里是否也有内存泄露呢?
如果你都能够很确定的知道泄露的原因,那么下面的文字,你就不需要阅读了,找个养眼的图片,养养眼吧。相反,如果你不确定,那么,下面的内容就对你很有帮助。
首先给没看出来的同学普及@property生成的set和get方法的具体内容:
- (NSObject *)aObj{
return aObj;
}
- (void)setAObj:(NSObject *)newobj{
if(newobj != aObj){
[aObj release];
aObj = [newobj retain];
}
}
现 在,将第一段代码,带入到这个set方法中去,你就能发现 self.aObj = [[NSObject alloc] init];是一个永远不会被释放的对象,aObj这个对象所对应的指针在alloc的时候被retain了一次retainCount=1,在set方 法中又被retain了一次,所以retainCount=2,在dealloc方法中,只有一次release,所以,retainCount=1,这
个指针空间就不会被释放,而第二段代码中,并没有使用set方法,而是将 [[NSObject alloc] init];的指针付值给aObj这个变量。只有一次alloc。故在程序执行dealloc方法的时候,这个指针空间就可以被释放。
下面给大家一段正确使用和释放self.的例子
NSObject *newobj = [[NSObject alloc] init];
self.aObj = newobj;
[newobj release];
...
...
- (void)dealloc{
self.aObj = nil;//这样写显的很简洁
[super dealloc];
}
对于@property([copy|assign])这两种情况,大家可以参考这个链接的文章。 http://www.cocoachina.com/macdev/cocoa/2010/1015/2194.html
相关文章推荐
- iPhone开发 - 使用self. 导致的内存泄露
- 使用self. 导致的内存泄露
- 使用self. 导致的内存泄露
- 使用self. 导致的内存泄露
- 使用self. 导致的内存泄露
- Unicode的设置不一致,导致CString的使用有内存泄露
- Android中Handler使用不当导致内存泄露的问题
- TransitionDrawable使用不当导致内存泄露
- QT中使用槽函数来关闭窗口,导致内存泄露的问题以及解决办法
- 使用Handler导致内存泄露的解决方法
- Android 中 Handler 引起的内存泄露 在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。其实这可能导致内存泄露,代码中哪里可能导致内存泄露,又是如何
- 使用ThreadLocal不当可能会导致内存泄露
- 使用Handler可能导致的内存泄露
- 使用dialog导致内存泄露的问题
- 如何避免使用CreateThread函数导致的内存泄露
- ArrayList 与HashSet的比较,及应用反射读取properties配置文件中的数据进行实例化再调用,以及类加载器的使用;还有HashCode的分析,及导致内存泄露,内存溢出的原因之一
- TransitionDrawable使用不当导致内存泄露
- Android融云使用不当产生的内存泄露和BUG(匿名类回调导致Activity内存泄露)
- 三星[4.4,5.0]使用EditText导致内存泄露
- asp.net使用Ajax+jquery+定时器,在IE(8--9)中导致内存无限增长,内存泄露