注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

云水禅心

淡若秋菊何妨瘦, 清到梅花不畏寒.

 
 
 

日志

 
 

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

2011-08-15 14:04:50|  分类: iphone |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
最近由于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
  评论这张
 
阅读(783)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018