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

标签 objective-c iphone xcode memory-management

//creates memory leak
  self.editMyObject = [[MyObject alloc] init];

//does not create memory leak
  MyObject *temp = [[MyObject alloc] init];
  self.editMyObject = temp;
  [temp release];

第一行代码会造成内存泄漏,即使您在类的 dealloc 方法中执行 [self.editMyObject release]。 self.editMyObject 是 MyObject 类型。第二行不会导致内存泄漏。第一行是不正确的还是有释放内存的方法?

最佳答案

正确的行为取决于 editMyObject @property 的声明。假设它被定义为

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

@property (copy) id editMyObject;

然后通过 self.editMyObject = 分配保留或复制分配的对象。由于 [[MyObject alloc] init] 返回一个保留对象,您作为调用者拥有该对象,因此您拥有 MyObject 实例的额外保留,因此除非有匹配的释放(如在第二 block )。我建议您阅读 Memory Management Programming Guide [2].

您的第二个代码块是正确的,假设该属性已按上述方式声明。

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

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

关于objective-c - 为什么这会造成内存泄漏(iPhone)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/612986/

相关文章:

xcode - 如何在 Xcode 中将 CLLocation 转换为字符串

objective-c - 如何将Unicode字符串(\u00e2等)转换成NSString显示?

ios - 如何在卸载应用程序时删除钥匙串(keychain)数据?

iphone - 使用 UISwitch

iphone - 在 Objective C++ 中管理内存我需要知道什么?

objective-c - 奇怪的委托(delegate)协议(protocol)声明错误?

ios - 使用 Open CV iOS 自动旋转和拉伸(stretch)图像。怎么修?

ios - 如何使用键将对象添加到 NSMutableDictionary?

c++ - Xcode 中的项目

iphone - Instagram 或 Hipstamatic 如何进行照片滤镜?