使用self. 导致的内存泄露
来源:互联网 发布:网红用的相机软件 编辑:程序博客网 时间:2024/05/24 05:47
请看第一段代码:
在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
0 0
- 使用self. 导致的内存泄露
- 使用self. 导致的内存泄露
- 使用self. 导致的内存泄露
- 使用self. 导致的内存泄露
- 使用self. 导致的内存泄露
- 使用Handler可能导致的内存泄露
- 使用Handler导致内存泄露的解决方法
- 使用dialog导致内存泄露的问题
- fork 导致的内存泄露
- 如何避免使用CreateThread函数导致的内存泄露
- 如何避免使用CreateThread函数导致的内存泄露
- Android中Handler使用不当导致内存泄露的问题
- 如何避免使用CreateThread函数导致的内存泄露
- Activitys中使用线程导致的内存泄露
- 如何避免由于使用Handler导致的内存泄露
- 内存泄露导致的内存溢出
- 内存泄露导致的内存溢出
- TransitionDrawable使用不当导致内存泄露
- java基础知识—Java中的反射机制
- HTML文档的常用标记
- iOS应用程序生命周期(前后台切换,应用的各种状态)详解 .
- 今天开通了ACM博客!
- django框架简介
- 使用self. 导致的内存泄露
- c++ 隐藏规则
- Hive
- 数据结构之线性结构的离散存储(循环列表和双向链表)
- IP地址首部详解
- 20-01 UITableView 表视图
- 线性表带头结点的单链表的链式表示和实现
- 一种简单并行的轨迹关联算法及其在小目标检测中的应用
- HBase