@interface Approval : NSObject
{
NSMutableArray *approvalValues;
}
@property (nonatomic,retain) NSMutableArray *approvalValues;
如果我这样做,我还需要在init方法中调用`approvalValues = [[NSMutableArray alloc] init]吗?我的印象是我必须这样做,但它造成了泄漏。在dealloc方法中,我发布了approvalValues
答案 0 :(得分:2)
您需要alloc
和init
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
,修正了术语