Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 什么';假设NSMutableArray/NSArray类集群安全吗?_Objective C_Cocoa_Abstract Class_Nsmutablearray_Nsarray - Fatal编程技术网

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]可变:NSCFArray
2010-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]可变添加:1
2010-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]可变:NSCFArray
2010-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]可变添加:1
2010-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。您不应该以这种方式设计代码。如果您想要/需要可变副本,请制作可变副本。在这种情况下,您可能需要向调用者返回一个新数组。