Objective c 什么';假设NSMutableArray/NSArray类集群安全吗?
我知道您不应该使用此选项来决定是否更改数组:Objective c 什么';假设NSMutableArray/NSArray类集群安全吗?,objective-c,cocoa,abstract-class,nsmutablearray,nsarray,Objective C,Cocoa,Abstract Class,Nsmutablearray,Nsarray,我知道您不应该使用此选项来决定是否更改数组: if ([possiblyMutable isKindOfClass:[NSMutableArray class]]) 但是假设我正在编写一个方法,并且需要返回一个NSMutableArray或一个NSArray,这取决于possiblyMutable的可变性。使用我的方法的类已经知道更改返回的数组是否可以接受。更改返回的数组是否可接受与更改possiblyMutable是否可接受直接相关 在这种特定情况下,此代码安全吗?在我看来,如果更改数组是不
if ([possiblyMutable isKindOfClass:[NSMutableArray class]])
但是假设我正在编写一个方法,并且需要返回一个NSMutableArray
或一个NSArray
,这取决于possiblyMutable
的可变性。使用我的方法的类已经知道更改返回的数组是否可以接受。更改返回的数组是否可接受与更改possiblyMutable
是否可接受直接相关
在这种特定情况下,此代码安全吗?在我看来,如果更改数组是不可接受的,但是我们意外地得到了一个可变数组,那么就可以了,因为使用我的方法的类不会尝试更改它。如果可以接受更改数组,那么我们将始终将possiblyMutable
作为NSMutableArray
(尽管这是我不完全清楚的部分)
所以。。。安全与否?替代品?不,根本不安全
如果您这样做:
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空基[55496:a0f]可变:NSCFArray2010-04-05 13:17:26.956排空基础[55496:a0f]正常:非放射性核素 你也不能这样做:
NSLog(@"Mutable add: %d", [ma respondsToSelector:@selector(addObject:)]);
NSLog(@"Normal add: %d", [aa respondsToSelector:@selector(addObject:)]);
因为这个日志:
2010-04-05 13:18:35.351清空基础[55525:a0f]可变添加:12010-04-05 13:18:35.351清空基础[55525:a0f]正常添加:1 保证拥有可变数组的唯一方法是获取现有数组的
-mutableCopy
,或者函数/方法的返回类型保证数组是可变的。否。根本不安全
如果您这样做:
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空基[55496:a0f]可变:NSCFArray2010-04-05 13:17:26.956排空基础[55496:a0f]正常:非放射性核素 你也不能这样做:
NSLog(@"Mutable add: %d", [ma respondsToSelector:@selector(addObject:)]);
NSLog(@"Normal add: %d", [aa respondsToSelector:@selector(addObject:)]);
因为这个日志:
2010-04-05 13:18:35.351清空基础[55525:a0f]可变添加:12010-04-05 13:18:35.351清空基础[55525:a0f]正常添加:1
保证拥有可变数组的唯一方法是获取现有数组的
-mutableCopy
,或者函数/方法的返回类型保证数组是可变的。如果确实需要可变数组,为什么不使用-mutableCopy
呢?如果确实需要可变数组,为什么不使用-mutableCopy
数组?更明确地说,不应该存在对可变数组和普通数组进行不同处理的情况。要做到这一点,您必须从创建阵列的那一刻起专门传递有关阵列可变性的信息,这是一个脆弱的设计噩梦。否则,您应该始终复制或可变复制数组,具体取决于所需的数组。那么,NSCoding是如何工作的呢?假设我有一个可变数组,并对其进行编码。解码后,我是否需要单步遍历数组并将mutableCopy
发送到每个子数组?否,NSCFArray在内部跟踪其自身的可变性(作为私有实现细节)。NSCoding将做正确的事情,因为NSCFArray可以定义自己的编码和解码。Double+1。您不应该以这种方式设计代码。如果您想要/需要可变副本,请制作可变副本。在这种情况下,您可能需要向调用者返回一个新数组。更明确地说,不应该存在对可变数组和普通数组进行不同处理的情况。要做到这一点,您必须从创建阵列的那一刻起专门传递有关阵列可变性的信息,这是一个脆弱的设计噩梦。否则,您应该始终复制或可变复制数组,具体取决于所需的数组。那么,NSCoding是如何工作的呢?假设我有一个可变数组,并对其进行编码。解码后,我是否需要单步遍历数组并将mutableCopy
发送到每个子数组?否,NSCFArray在内部跟踪其自身的可变性(作为私有实现细节)。NSCoding将做正确的事情,因为NSCFArray可以定义自己的编码和解码。Double+1。您不应该以这种方式设计代码。如果您想要/需要可变副本,请制作可变副本。在这种情况下,您可能需要向调用者返回一个新数组。