我是否需要使用retain属性分配和初始化变量?(iphone)

时间:2011-07-06 16:28:02

标签: iphone objective-c xcode

@interface Approval : NSObject 
{
    NSMutableArray *approvalValues;
}
@property (nonatomic,retain) NSMutableArray *approvalValues;

如果我这样做,我还需要在init方法中调用`approvalValues = [[NSMutableArray alloc] init]吗?我的印象是我必须这样做,但它造成了泄漏。在dealloc方法中,我发布了approvalValues

3 个答案:

答案 0 :(得分:2)

您需要allocinit approvalValues。问题似乎与您过度保留对象的事实有关。

您的代码可能如下所示:

self.approvalValues = [[NSMutableArray alloc] init];

alloc将返回retainCount为1的对象,并且在使用retain setter时,它将被提升为2.为了解决它,您可能希望{ {1}}对象在分配之前,制作如下代码:

autorelease

最终会得到一个self.approvalValues = [[[NSMutableArray alloc] init] autorelease]; 只有1的实例变量,所以当你retainCount这个对象时它不会泄漏。

答案 1 :(得分:0)

是的,你仍然需要alloc / init,但是你只能在dealloc方法中发布。

答案 2 :(得分:0)

在init方法中,您经常会直接访问ivar并将其初始化为:

approvalValues = [[NSMutableArray alloc] init];

在dealloc中,你需要一个像这样的matchin版本:

[approvalValues release];

通常建议直接在init和dealloc方法中访问ivars,以避免由setter / getter引起的任何副作用。

在整个课程中,您将需要使用 KVC setter / getters或点符号来设置此类对象

// Dot notation
NSMutableArray *tmpApprovalValues = [[NSMutableArray alloc] init];
self.approvalValues = tmpApprovalValues;
[tmpApprovalValues release]; tmpApprovalValues = nil;

// Call to setters/getters
NSMutableArray *tmpApprovalValues = [[NSMutableArray alloc] init];
[self setApprovalValues:tmpApprovalValues];
[tmpApprovalValues release]; tmpApprovalValues = nil;

由于@Yuji

,修正了术语