我是一名新的Objective-C程序员,有时与这种语言的所有权概念相混淆....目前我正在学习iPhone编程......
以下是那些让我困惑的案例..
我正常使用这些(有时是第一次,有时是其他的)
NSMutableArray *array; //Declared in header
案例1
array1= [databaseClass getData];
案例2
array1 = [NSMutableArray arrayWithArray:[databaseClass getData]];
这里[databaseClass getData]
返回一个非自动释放的对象数组。
我只是想说明他们中的任何人都是正确的吗?
如果没有,那么请建议正确的......
修改
我的意思是说[databaseClass getData]
已经返回一个已分配的数组(我的意思是一个非自动释放的数组)现在我认为如果我想在我的课程中使用它我不需要分配我的数组(i已经测试了这个并且它有效),这里我唯一的问题是关于那个array1
初始化....以上任何一个陈述是否有任何意义......如果没有那么我请求请提供一个块代码让我变得更加清晰......
谢谢
答案 0 :(得分:6)
两个案例都应该为您提供一个自动释放的对象。如果出现以下情况,您就是所有者:
alloc
分配了对象。copy
的方法创建了对象的副本,如mutableCopy
中所示(返回的副本属于您,而不是您调用{{1}的对象}方法)。copy
编辑了它。在所有其他情况下,您可以假设您不是所有者,并且您不需要释放该对象。
因此,如果您的retain
方法未返回自动释放的对象,则应对其进行修改。否则使用此代码的其他人将创建内存泄漏(您可能会以这种方式混淆自己)。
编辑:
根据Objective-C中的命名约定,getData
方法应该返回一个自动释放的对象。所以它应该被编辑以返回一个自动释放的对象,如果它还没有。
如果要编辑阵列,则需要从中制作可变副本。您可以拨打getData
或[NSMutableArray arrayWithArray:[databaseClass getData]];
。在第一种情况下,阵列是自动释放的,您不所有者,而不需要在其上调用[[databaseClass getData] mutableCopy]
。在第二种情况下, 是所有者(根据release
规则),需要稍后发布。