2011-05-02 72 views
0

我是一个新的Objective-C编程,有时混淆这种语言的那些所有权概念的好方法....目前我正在学习的iPhone编程....以下哪种方式是初始化

这里区分那些困惑我总是..

我通常使用这些(有时第一和有时其它)

NSMutableArray *array;  //Declared in header 

壳体1

array1= [databaseClass getData]; 

案例2

array1 = [NSMutableArray arrayWithArray:[databaseClass getData]]; 

这里[databaseClass getData]返回一个对象nonAutoreleased阵列.. 我只想符合是他们的人是正确的?

如果没有的话,请提出正确的....

编辑

我的意思是说,[databaseClass getData]已经返回我的阵列分配的,现在(我是指非自动释放阵列)我想我并不需要分配我的数组,如果我想在我的班级使用它(我已经测试这和它的作品),我在这里的唯一的问题是关于array1初始化....难道上面的语句任何人作出任何感觉......如果没有,那么我请求提供一段代码,以使它对我更加清楚...... 谢谢

回答

6

两个箱子应该给你一个自动释放的对象。如果您是所有者:

  • 您通过alloc分配了对象。
  • 您通过一个包含单词copy的方法创建了一个对象的副本,如mutableCopy(返回的副本属于您,而不是您称为copy方法的对象)。
  • retain编它。

在所有其他情况下,您可以假定您不是所有者,也不需要释放对象。

因此,如果您getData方法不返回一个自动释放的对象,因此它应该修改它。否则,其他使用此代码的人将会创建内存泄漏(并且您可能会以这种方式混淆自己)。

编辑问题后,得到了编辑:

根据Objective-C的命名惯例,getData方法应该返回一个自动释放的对象。所以它应该被编辑来返回一个自动释放的对象,如果它还没有。

如果你要编辑的数组你需要从它使一个可变的副本。您可以致电[NSMutableArray arrayWithArray:[databaseClass getData]];[[databaseClass getData] mutableCopy]。在第一种情况下,阵列是autoreleased,你是而不是所有者,你做不是需要调用release就可以了。在第二种情况下,您的所有者(按照copy规则),并且需要稍后发布。

+0

也许第二个意味着一个额外的方法调用,昂贵:-P – 2011-05-02 11:53:42

+0

好的....请清楚我,在这里我使用[databaseClass getData],返回我一个分配的数组.....然后我的想法是我不应该再次分配我的数组...并且必须释放它,因为它现在是指向数据库类数组的指针 – sajwan 2011-05-02 11:54:55

+0

@Praveen S:我不明白你的意思。我只列出了Objective-C的所有权规则,与“额外的方法调用”无关。 – DarkDust 2011-05-02 11:55:25

相关问题