在.h file
我有:
NSMutableArray *myArray;
@property (nonatomic, retain) NSMutableArray *myArray;
我的.m file
看起来基本上是这样的:
@synthesize myArray;
- (id) init {
self = [super init];
if (self != nil)
{
self.myArray = .... ? // here I want to create an empty array
}
return self;
}
- (void) dealloc {
[self.myArray release];
[super dealloc];
}
我不确定的是init
中的内容。
1)
self.myArray = [[NSMutableArray alloc] init];
2)
NSMutableArray *tmp = [[NSMutableArray alloc] init];
self.myArray = tmp;
[tmp release];
解决方案1对我来说似乎不对,因为我的@property (retain)
设置我在设置self.myArray时自动增加了保留计数器,但另外由于{{{I}已经有“+1保留” 1}}然后以该对象的保留计数为2结束,但仅在[NSMutableArray alloc]
中释放一次。因此,第二种解决方案对我来说似乎更正确,即使它很麻烦。
我也想知道dealloc
是否与self.myArray = ...
实际上相同,因此会增加保留次数。
更新
我实际上找到了答案(甚至更多细节)here以防万一有兴趣阅读更多内容。
答案 0 :(得分:4)
self.myArray =
与[self setMyArray:...]
完全相同。
然而,你可以做myArray = [[NSMutableArray alloc] init];
,最终保留计数为1,并且完全合法。
答案 1 :(得分:1)
是的,self.myArray = ...
与[self setMyArray:...]
因此,设置过程会为您的对象添加冗余保留。您可能应该在集合之后立即释放它,尽管我已经看到一些使用autorelease的代码,无论如何。这两种方法都很尴尬。
可以避免设置访问者(myArray = ...
),但是纯粹主义者也不赞成绕过访问者。
答案 2 :(得分:1)
另一种选择是使用返回自动释放实例的便捷方法:
self.myArray = [NSMutableArray array];