2

我的目的:对服务器进行 API 调用,然后从它们那里取回一个名为的数据数组,dataArr我想将这些数据存储到另一个数组中以备后用。

到目前为止我正在做的是

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)

我只是想仔细检查我是否走在正确的道路上。

如果我刚刚在中间犯了错误,请纠正我。谢谢 欢迎任何意见。

4

2 回答 2

3
dataList = [dataArr];

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

dataList = dataArr;

这仍然是不行的,因为您直接访问实例变量,而不是通过属性设置器,也就是说,您的数组将不会被保留并且它会严重崩溃。

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

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

如果你有一个属性设置器(你有),只需写

self.dataList = dataArr;

这将正确保留数组。顺便说一句,setter 的实现类似于您的最后一个方法,但它会检查其中一个是否不相等:

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

或 pre- retains 要设置的对象:

- (void)setDataList:(NSArray *)dl
{
    [dl retain];
    [dataList release];
    dataList = dl;
}
于 2012-05-07T16:23:15.477 回答
1

添加@synthesize 数据列表;所以编译器可以生成默认的setter

然后在第 4 行添加:

self.dataList = dataArr;

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

于 2012-05-07T16:27:32.320 回答