Iphone 将数据保存到另一个阵列、内存管理、目标C

Iphone 将数据保存到另一个阵列、内存管理、目标C,iphone,objective-c,memory-management,Iphone,Objective C,Memory Management,我的目的是:对服务器进行API调用,然后从服务器返回一个名为dataArr的数据数组,我想将这些数据存储到另一个数组中,以备以后需要 到目前为止,我正在做的是 myClass.h: myClass.m: 要填写第3行,我有两个选项,选项A: dataList = dataArr; 或备选方案B: [dataList release]; [dataArr retain]; dataList = dataArr; 我认为选项A是正确的方法,因为dataList在头文件中声明为retain。因此,

我的目的是:对服务器进行API调用,然后从服务器返回一个名为dataArr的数据数组,我想将这些数据存储到另一个数组中,以备以后需要

到目前为止,我正在做的是

myClass.h:

myClass.m:

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

dataList = dataArr;
或备选方案B:

[dataList release];
[dataArr retain];
dataList = dataArr;
我认为选项A是正确的方法,因为dataList在头文件中声明为retain。因此,setter将确保释放当前数组数据列表,并重新接收接收到的数组数据arr

我只是想再次检查一下我是否走在正确的道路上

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

dataList = [dataArr];
这不是有效的Objective-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];
    }
}
或预先保留要设置的对象:

- (void)setDataList:(NSArray *)dl
{
    [dl retain];
    [dataList release];
    dataList = dl;
}
这不是有效的Objective-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];
    }
}
或预先保留要设置的对象:

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

添加@synthesis数据列表;因此编译器可以生成默认的setter

然后在第4行中添加:

self.dataList = dataArr;

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

add@synthesis dataList;因此编译器可以生成默认的setter

然后在第4行中添加:

self.dataList = dataArr;

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

您必须使用self.dataList调用属性setter我以前说过,我会再说一遍……我很高兴我的团队决定转移到ARC。你花更多的时间编写代码,更少的时间担心忘记保留/发布。你必须使用self.dataList调用属性setter我以前说过,我会再说一遍……我很高兴我的团队决定转移到ARC。您将花费更多的时间编写代码,更少的时间担心忘记保留/发布。