当前位置:  开发笔记 > IOS > 正文

为什么这会造成内存泄漏(iPhone)?

如何解决《为什么这会造成内存泄漏(iPhone)?》经验,为你挑选了2个好方法。

正确的行为取决于editMyObject @property的声明.假设它是delcared

@property (retain) id editMyObject; //id may be replaced by a more specific type

要么

@property (copy) id editMyObject;

然后通过self.editMyObject =保留或复制指定的对象进行分配.由于[[MyObject alloc] init]返回一个保留的对象,你作为调用者拥有的对象,你有一个额外的MyObject实例保留,因此它将泄漏,除非它有匹配的版本(如在第二个块中).我建议你阅读内存管理编程指南 [2].

假设属性如上所述声明,则第二个代码块是正确的.

ps你不应该[self.editMyObject release]-dealloc方法中使用.你应该打电话[editMyObject release](假设ivar支持@property被调用editMyObject).调用访问器(通过self.editMyObject@synthesized访问器是安全的,但如果覆盖访问器依赖于对象状态(可能在调用位置无效-dealloc或导致其他副作用),则通过调用访问器会出现错误.

[2] Cocoa中的对象所有权规则非常简单:如果你调用一个方法alloc,或者copy在其签名中(或者使用+[NSObject new]它基本上等同于[[NSObject alloc] init]),那么你"拥有"返回的对象,你必须平衡你的获取拥有所有权release.在所有其他情况下,您不拥有从方法返回的对象.如果你想保留它,你必须拥有一个retain,并在以后释放所有权release.



1> Barry Wark..:

正确的行为取决于editMyObject @property的声明.假设它是delcared

@property (retain) id editMyObject; //id may be replaced by a more specific type

要么

@property (copy) id editMyObject;

然后通过self.editMyObject =保留或复制指定的对象进行分配.由于[[MyObject alloc] init]返回一个保留的对象,你作为调用者拥有的对象,你有一个额外的MyObject实例保留,因此它将泄漏,除非它有匹配的版本(如在第二个块中).我建议你阅读内存管理编程指南 [2].

假设属性如上所述声明,则第二个代码块是正确的.

ps你不应该[self.editMyObject release]-dealloc方法中使用.你应该打电话[editMyObject release](假设ivar支持@property被调用editMyObject).调用访问器(通过self.editMyObject@synthesized访问器是安全的,但如果覆盖访问器依赖于对象状态(可能在调用位置无效-dealloc或导致其他副作用),则通过调用访问器会出现错误.

[2] Cocoa中的对象所有权规则非常简单:如果你调用一个方法alloc,或者copy在其签名中(或者使用+[NSObject new]它基本上等同于[[NSObject alloc] init]),那么你"拥有"返回的对象,你必须平衡你的获取拥有所有权release.在所有其他情况下,您不拥有从方法返回的对象.如果你想保留它,你必须拥有一个retain,并在以后释放所有权release.



2> Andrew Grant..:

您的属性被声明为"retain",这意味着传入的对象会自动保留.

因为你的对象已经有来自alloc/init的引用计数为1,所以有两个引用,我假设只有一个版本(在你的析构函数中).

基本上对self.editMyObject的调用实际上是这样做的;

-(void) setEditMyObject:(MyObject*)obj
{
  if (editMyObject)
  {
    [editMyObject release];
    editMyObject = nil;
  }

  editMyObject = [obj retain];
}

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有