2010-04-05 23 views
0

我知道你不应该使用这个来决定是否要更改数组:假设有关NSMutableArray/NSArray类集群的安全性是什么?

if ([possiblyMutable isKindOfClass:[NSMutableArray class]]) 

但是说我正在写一个方法,需要在回报的NSMutableArrayNSArray,取决于易变性possiblyMutable。使用我的方法的类已经知道是否可以更改返回的数组。是否可以改变返回的数组直接与是否可以改变possiblyMutable相关。

在这种特定情况下,此代码是否安全?在我看来,如果它是而不是可以接受更改数组,但我们意外地得到了一个可变数组,但没关系,因为使用我的方法的类不会尝试更改它。如果它可以接受改变阵列,那么我们将总是得到possiblyMutable作为NSMutableArray(虽然这是我不完全清楚的部分)。

那么......安全还是不安全?备择方案?

+0

如果你确实需要一个可变数组,那么为什么不使用'-mutableCopy'? – kennytm 2010-04-05 19:07:50

回答

4

编号不安全。

如果你这样做:

NSMutableArray * ma = [NSMutableArray arrayWithObject:@"foo"]; 
NSArray * aa = [NSArray arrayWithObject:@"foo"]; 

NSLog(@"Mutable: %@", [ma className]); 
NSLog(@"Normal: %@", [aa className]); 

然后你得到:

2010-04-05 13:17:26.928 EmptyFoundation [55496:A0F]易变:NSCFArray
2010-04- 05 13:17:26.956 EmptyFoundation [55496:A0F]正常:NSCFArray

你也可以这样做:

NSLog(@"Mutable add: %d", [ma respondsToSelector:@selector(addObject:)]); 
NSLog(@"Normal add: %d", [aa respondsToSelector:@selector(addObject:)]); 

由于此记录:

2010-04-05 13:18:35.351 EmptyFoundation [55525:A0F]易变添加:1
2010-04-05 13:18:35.351 EmptyFoundation [ 55525:A0F]正常加:1个

,确保您有一个可变的数组的唯一途径是利用现有阵列的-mutableCopy或者如果一个函数/方法的返回类型保证阵列将是可变的。

+3

为了更明确一点,不应该出现这样的情况,即对待可变数组和正常数组的处理方式不同。要做到这一点,你必须专门传递有关阵列可变性的信息,这是一个脆弱的设计噩梦。否则,你应该总是复制或mutableCopy数组取决于你想要的。 – Chuck 2010-04-05 19:24:32

+0

那NSCoding是如何工作的呢?说我有一个可变数组的数组,我编码它。解码后,我是否需要遍历数组并将mutableCopy发送给每个子阵列? – andyvn22 2010-04-05 20:00:54

+1

不,NSCFArray在内部跟踪自己的可变性(作为私有实现细节)。 NSCoding会做正确的事情,因为NSCFArray可以定义自己的编码和解码。 – 2010-04-05 20:30:40

相关问题