理解Cocoa内存

3
做这件事情的优势是什么?
NSArray *array = [[NSArray alloc] initWithObjects:@"Year", "@Capital", ..., nil];
self.hintArray = array;
[array release];

不要像这样直接给我的类变量赋值:

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

为什么我们要创建一个临时的本地对象,然后释放它,而不是直接赋值给我们的类变量呢?
3个回答

7

其他人已经指出了内存问题,但是这里有一个在单个步骤中完成的最佳方法:

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

方便的类方法+arrayWithObjects返回一个已经被自动释放的数组,所以您不需要再担心它了。您的属性访问器将负责复制或保留它(当然,假设您的hintArray属性已经设置为retaincopy属性)。


太好了!对我来说,使用自动释放的代码是正确的选择。 - Bryan

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
糟了!请不要这样做!你的代码假定-hintArray方法会返回完全相同的对象,而你传递到-setHintArray:设置器方法中。如果它没有这样做(这很容易发生),你的应用程序将在某个时候崩溃。 - Mike Abdullah

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

去掉“self”并使用“hintArray = [[NSArray alloc] initWithObjects:@”Year“,@”Capital“,...,nil];”的缺点是您也绕过了任何自定义setter/getter代码,对吗?但是,如果您知道没有setter/getter代码,这样做是否可以?或者也被认为是不好的Cocoa形式? - Meltemi
哈哈,我自己也才刚开始掌握Objective-C内存管理的技巧,所以我不敢妄下定论什么是好的做法或者不好的做法。eJames和fbrerton似乎更加熟练掌握这个主题。 - cmsjr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接