gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:30:23 24 4
gpt4 key购买 nike

//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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com