了解可可记忆

时间:2009-09-02 16:54:18

标签: objective-c memory-management

这样做有什么好处:

NSArray *array = [[NSArray alloc] initWithObjects:@"Year", "@Capital", ..., nil];
self.hintArray = array;
[array release];

而不是像这样直接分配给我的类变量:

self.hintArray = [[NSArray alloc] initWithObjects:@"Year", "@Capital", ..., nil];

为什么我们创建一个临时本地对象然后释放它而不是仅仅分配给我们的类变量?

3 个答案:

答案 0 :(得分:7)

其他人已经指出了内存问题,但这是一步完成的最好方法:

self.hintArray = [NSArray arrayWithObjects:@"Year", "@Capital", ..., nil];

便捷类方法+arrayWithObjects返回一个已经自动释放的数组,因此您根本不需要再担心它了。您的财产访问者将负责复制或保留它。 (当然,假设您的hintArray属性设置为retaincopy属性。

答案 1 :(得分:4)

你可以,但你必须记得在继续之前释放它一次。对self.hintArray的赋值(假设它是一个保留在集合上的合成setter)将碰撞retainCount:

NSArray *array = [[NSArray alloc] initWithObjects:...]; // retainCount is 1
self.hintArray = array; // retainCount is 2
[array release]; // retainCount is 1

self.hintArray = [[NSArray alloc] initWithObjects:...]; // retainCount is 2:
                                                        // one for the alloc
                                                        // and one for the assign
[self.hintArray release]; // retainCount is 1

答案 2 :(得分:0)

因为在Objective-C引用计数内存管理方案中,数组的创建将增加引用计数,如果不将返回值存储在变量中,则可以向您发送释放消息将无法减少计数并将引入内存泄漏。