现在的位置: 首页 > 综合 > 正文

【引用】iPhone开发 - 使用self. 导致的内存泄露

2012年08月14日 ⁄ 综合 ⁄ 共 1425字 ⁄ 字号 评论关闭

1:原文摘自:http://linglong117.blog.163.com/blog/static/2771454720117152450708/

 

最近由于iOS5的问题,从iOS5的sdk完整的将项目重新迁移回4.2版本的sdk,一直到今天,内存问题才彻底结束,不禁让我感叹,iOS5的ARC的性能之好,入Apple文档中所说,有了ARC之后,你就可以投入更多的精力到程序的设计和其他方面。好了,回到正题,今天和大家分享一个关于使用self.obj 的内存泄露问题。

这里是背景:
项目中有一个对象 MyObject,通过@property (retain) 的方式声明了一个属性NSObject *aObj;
请注意一点,MyObject.h中@property (retain),这里仅讨论retain的情况
请看第一段代码:
在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

抱歉!评论已关闭.