0

我想将自定义对象分配给实例变量。

这是代码:
- MyController.h/.m

#import "CustomData.h"  
@interface MyViewController : NSViewController  
@property (retain) CustomData* theData;  

- (void)aRandomMethod; 

@end

@implementation MyViewController  
@synthetize theData;  

- (void)aRandomMethod {  

   NSData* rawData = [someOtherObject someOtherMethod];

   // option 1
   self.theData = [[CustomData alloc] initWithData:rawData];

   // option 2
   CustomData* _theData = [[Custom alloc] initWithData:rawData];

   // option 3
   self.theData = [[[CustomData alloc] initWithData:rawData] autorelease];

   // option 4
   theData = [[CustomData alloc] initWithData:rawData];

   // ... later code calls some methods on theData or _theData, not useful here.
 }
@end

在 Xcode 中运行分析功能时,它告诉我选项 1 和 2 有一个“泄漏的对象未在以后引用...”,但选项 3 和 4 没有。看来我autorelease在使用时需要自定义对象二传手。我知道autorelease在方法中返回我们拥有的对象时需要使用它。

你能解释一下每个选项为什么是错还是对?谢谢。

4

2 回答 2

5

选项 1 是错误的,因为您alloc在该方法中 d 了对象,因此该方法现在拥有该对象,因此需要release它。当您将它分配给一个属性时,retain它就是它,并且在它完成时期望release它。

出于同样的原因,选项 2 是错误的。您取出了它的属性部分,但是因为您使用创建了对象alloc,所以您有责任release在该方法中调用它。

选项 3 是正确的,因为您在autorelease将其提供给属性之前已将其 d,因此该方法不再拥有它。请注意,如果您release在此处使用它会损坏,因为它会release在属性获得机会之前损坏retain

选项 4 可能是正确的;我假设它将它分配给一个ivar。仅当您稍后在 dealloc 方法中手动释放 ivar 时才正确。不过,通常最好通过属性。否则,您将面临分配另一个值并忘记release现有值的风险。

于 2013-04-16T22:17:35.750 回答
1

选项 1 和 2 最需要注意的是有一个 alloc,因此需要一个对应的版本。

选项 1 本质上是“隐藏的”,因为编译器会自动为您生成 setter 和 getter。您没有看到的是,当使用点表示法时,您正在通过 setter,它隐含地包含一个保留调用。因此,您正在分配对象并保留,使其保留计数为 2。

因此,为了确保以后能够正常释放,您必须指定将其添加到自动释放池中,以供系统稍后清理。这将使保留计数变为 1,然后在您的 dealloc 方法中,您可以安全地释放该属性。

于 2013-04-16T22:21:51.840 回答