以下哪种方式是初始化的好方法

时间:2011-05-02 11:47:27

标签: iphone objective-c memory-leaks nsmutablearray

我是一名新的Objective-C程序员,有时与这种语言的所有权概念相混淆....目前我正在学习iPhone编程......

以下是那些让我困惑的案例..

我正常使用这些(有时是第一次,有时是其他的)

 NSMutableArray *array;     //Declared in header

案例1

array1= [databaseClass getData];

案例2

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

这里[databaseClass getData]返回一个非自动释放的对象数组。 我只是想说明他们中的任何人都是正确的吗?

如果没有,那么请建议正确的......

修改

我的意思是说[databaseClass getData]已经返回一个已分配的数组(我的意思是一个非自动释放的数组)现在我认为如果我想在我的课程中使用它我不需要分配我的数组(i已经测试了这个并且它有效),这里我唯一的问题是关于那个array1初始化....以上任何一个陈述是否有任何意义......如果没有那么我请求请提供一个块代码让我变得更加清晰...... 谢谢

1 个答案:

答案 0 :(得分:6)

两个案例都应该为您提供一个自动释放的对象。如果出现以下情况,您就是所有者:

  • 您通过alloc分配了对象。
  • 您通过包含单词copy的方法创建了对象的副本,如mutableCopy中所示(返回的副本属于您,而不是您调用{{1}的对象}方法)。
  • copy编辑了它。

在所有其他情况下,您可以假设您不是所有者,并且您不需要释放该对象。

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

问题编辑后

编辑

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

如果要编辑阵列,则需要从中制作可变副本。您可以拨打getData[NSMutableArray arrayWithArray:[databaseClass getData]];。在第一种情况下,阵列是自动释放的,您所有者,而需要在其上调用[[databaseClass getData] mutableCopy]。在第二种情况下, 是所有者(根据release规则),需要稍后发布。