Objective-C:在另一个对象的init中分配对象(内存管理)

时间:2010-05-12 11:19:44

标签: iphone objective-c memory-management

.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以防万一有兴趣阅读更多内容。

3 个答案:

答案 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];