2012-05-07 112 views
2

我的目的:对服务器进行API调用,并从它们回来的是一个名为dataArr的数据数组,我想将这些数据存储到另一个数组以供日后需要。将数据保存到另一个阵列,内存管理,目标C

我在做什么,到目前为止是

myClass.h

@propery (nonatomic, retain) NSArray *dataList; 

myClass.m

@implementation myClass 
-(void)receivedData:(NSArray*) dataArr { 
    // ??? 
} 

要在第3行填写,我有两个选择,选择A:

dataList = dataArr; 

或选项B:

[dataList release]; 
[dataArr retain]; 
dataList = dataArr; 

我觉得选项A是这样做,因为dataList被声明为在头文件retain的正确途径。因此,setter将确保释放当前数组(dataList)并保留接收数组(dataArr)以及

我只是想仔细检查一下我是否在正确的路径上。

请纠正我,如果我刚刚在中间犯了一个错误。谢谢 欢迎任何评论。

+0

必须使用self.dataList调用的财产二传手 – rodowi

+0

我已经说过了,我会再说一遍......我很高兴我的团队决定搬到ARC。您花更多时间来编写代码,而更少时间担心忘记保留/释放。 –

回答

3
dataList = [dataArr]; 

这是无效的Objecitve-C。如果你想写

dataList = dataArr; 

这仍然是一个没有去,因为你直接acessing实例变量,而不是通过属性setter,也就是你的阵列将不会被保留,这将严重崩溃。

[dataList release]; 
[dataArr retain]; 
dataList = dataArr; 

又错了。如果dataListdataArr相同,并且对象的引用(self)是最后一个引用,则它将被释放,破坏以下retain消息,并且很可能再次崩溃。

如果你有一个属性setter(你有),简单的写

self.dataList = dataArr; 

这将正确地保留阵列。顺便说一句,在二传手的实现是像你的最后一个方法,但它会检查任何不平等:

- (void)setDataList:(NSArray *)dl 
{ 
    if (dataList != dl) 
    { 
     [dataList release]; 
     dataList = [dl retain]; 
    } 
} 

或预retain S中的对象设置:

- (void)setDataList:(NSArray *)dl 
{ 
    [dl retain]; 
    [dataList release]; 
    dataList = dl; 
} 
1

添加@合成dataList;所以编译器可以生成默认的setter

然后在第4行中添加:

self.dataList = dataArr; 

默认设置器将负责释放和保持以正确的方式