Ios 如何保存已组装的NSArray?

Ios 如何保存已组装的NSArray?,ios,objective-c,arrays,automatic-ref-counting,Ios,Objective C,Arrays,Automatic Ref Counting,有时我必须在某些条件下“加载”数组。 因此,我有一个for循环,并将该对象添加到一个临时NSMutableArray 但是,当我的组装过程完成并且我只需要属性中的静态数组时,最好的做法是什么呢 我应该为NSArray酒店设置临时住宿吗 我应该使用NSMutableArray的复制方法并将其复制到属性吗 我应该使用[[NSArray alloc]initWithArray:tempArray] 我应该使用[NSArray arrayWithArray:tempArray]吗init有什么区别吗

有时我必须在某些条件下“加载”数组。 因此,我有一个for循环,并将该对象添加到一个临时NSMutableArray

但是,当我的组装过程完成并且我只需要属性中的静态数组时,最好的做法是什么呢

  • 我应该为NSArray酒店设置临时住宿吗
  • 我应该使用NSMutableArray的复制方法并将其复制到属性吗
  • 我应该使用
    [[NSArray alloc]initWithArray:tempArray]
  • 我应该使用
    [NSArray arrayWithArray:tempArray]
    init
    有什么区别吗

对于性能和内存而言,什么是继续的最佳方式?

所有这些解决方案在性能方面没有太大差异-但是我建议使用最后一个,因为它是最干净的:

[NSArray arrayWithArray:tempArray]
这与init的区别在于,这一个返回autorelease对象和init返回+1 retain count对象(必须释放它才能解除锁定)

当您使用[copy]时,也需要释放此对象。当然,如果你正在使用ARC,你不必太担心这个问题


在性能和将其保留为属性方面—如果您可以重用构造的数组,请在完成一次后将其保留在属性中,这样就有机会重用结果。如果每次都要重新构造它,请使用局部变量。

NSMutableArray
NSArray
的子类,因此最简单的方法是将可变数组分配给一个(不可变的)
NSArray*
变量。然而,由于Objective-C的运行时动态性,如果您的代码格式不正确,您可能会意外地改变这个预期为静态的数组。如果创建数组的不可变副本,任何此类意外调用都将导致程序崩溃


NSMutableArray
-copy
方法应该返回一个可变副本,所以我认为这不是您想要做的。您编写的最后两个选项在ARC的优化下是等效的;区别在于
+arrayWithArray:
返回一个自动删除的对象,而
-initWithArray:
返回一个保留的对象

下面是一个不同的示例,如果您意外调用
NSMutableArray
方法,例如
-removeAllObjects

NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:n];
for (int i = 0; i != n; ++i) {
    // add object to tempArray
    [tempArray addObject:[NSNumber numberWithInt:n];
}

// option 1:
[self setArray:tempArray];
[[self array] removeAllObjects]; // succeeds (that's bad)

// option 2:
[self setArray:[tempArray copy]];
[[self array] removeAllObjects]; // succeeds (that's bad)

// option 3:
NSArray *immutableArray = [[NSArray alloc] initWithArray:tempArray];
[self setArray:immutableArray];
[[self array] removeAllObjects]; // fails (that's good)
// if not ARC: [immutableArray release];

// option 4:
NSArray *immutableArray = [NSArray arrayWithArray:tempArray];
[self setArray:immutableArray];
[[self array] removeAllObjects]; // fails (that's good)

将NSArray属性设置为
copy
属性通常是一个好主意。所以在大多数情况下,您只需执行
self.myProperty=temporaryArray
。通常最好让访问器为您处理这样的内存管理问题,以便将责任集中在一个小区域