gpt4 book ai didi

objective-c - Objective-C : how to check if variable is NSArray or NSMutableArray

转载 作者:IT王子 更新时间:2023-10-29 08:02:51 30 4
gpt4 key购买 nike

如何检查变量是 NSArray 还是 NSMutableArray?

最佳答案

*请注意,NS{,Mutable}Array 的实现自撰写此答案以来已更改。因此,isKindOfClass: 现在可以使用了。我不知道何时何地在什么平台上。

在证明这样做是安全的之前,我会强烈建议不要编写试图检测集合是可变的还是不可变的代码。即使它是安全的,这样的设计模式也几乎总是表明存在严重的设计缺陷。

(对于那些有访问权限的人)归档 rdar://10355515 要求澄清。


考虑:

int main (int argc, const char * argv[]) {
NSArray *array = [NSArray arrayWithObjects: [NSObject new], nil];
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects: [NSObject new], nil];

NSLog(@"array's class: %@", NSStringFromClass([array class]));
NSLog(@"mutableArray's class: %@", NSStringFromClass([mutableArray class]));

NSLog(@"array responds to addObject: %@",
[array respondsToSelector: @selector(addObject:)] ? @"YES" : @"NO");

return 0;
}

(我使用非空数组是因为空的 NSArray 很常见,Cocoa 提供了一个共享实例作为优化。)

array's class: NSCFArray
mutableArray's class: NSCFArray
array responds to addObject: YES

-isKindOfClass: 和检查 addObject: 的实现都不起作用。

简而言之,您无法区分 NSArray 和 NSMutableArray。这是设计使然,而且非常符合预期的行为。它也适用于 NSStringNSDictionaryNSSet(所有这些都有一个可变子类)。

这可能会让人感到意外。但现实情况是,需要检查可变性的设计模式使用起来很困惑,而且会产生巨大的开销。

例如,如果可变性测试是一种常见模式,那么 Cocoa 中所有返回 NSArray 实例的方法都必须实际返回 NSArray 实例,并且永远不会返回对可能正在使用的内部 NSMutableArray 的引用。

关于objective-c - Objective-C : how to check if variable is NSArray or NSMutableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1788690/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com