Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.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 如何识别可变对象?_Objective C_Cocoa_Immutability_Introspection - Fatal编程技术网

Objective c 如何识别可变对象?

Objective c 如何识别可变对象?,objective-c,cocoa,immutability,introspection,Objective C,Cocoa,Immutability,Introspection,在我的应用程序中,在某个时刻,我需要识别可变对象以适当地处理它们。事实证明,这比看起来要困难得多 如果在NSString上使用iskindof类:[NSMutableString类],则所有字符串似乎都是可变的 如果我问他们是否响应@selector(appendString:),他们都会响应 如果我真的尝试在一个@try..@catch..@finally块中对它们进行变异,真相就会被揭示出来。然而,这是非常不雅和非常缓慢 最好的做法是什么?如果您想忽略易变性,可以迭代循环,并使用-mutab

在我的应用程序中,在某个时刻,我需要识别可变对象以适当地处理它们。事实证明,这比看起来要困难得多

如果在
NSString
上使用
iskindof类:[NSMutableString类]
,则所有字符串似乎都是可变的

如果我问他们是否响应
@selector(appendString:)
,他们都会响应

如果我真的尝试在一个
@try
..
@catch
..
@finally
块中对它们进行变异,真相就会被揭示出来。然而,这是非常不雅和非常缓慢


最好的做法是什么?

如果您想忽略易变性,可以迭代循环,并使用
-mutableCopy
创建每个字符串的易变副本(无论如何,它都会创建NSMutableStrings)。反之亦然:通过向每个对象发送
-copy
,可以保证获得一个不可变的NSString。不幸的是,由于NSString是一个类集群,所以可变性不是一个干净的可测试概念。检查带有
@“\uu NSCFString”
行的类是非常不安全的,因为苹果有权随时更改基础类。

您已经尝试使用
isMemberOfClass[[NSMutableString]]
?您是否试图确定该类实际上是
NSMutableString
?如果是这样,您是否尝试过使用
isMemberOfClass:
方法,如果它实际上是类的成员(但不是子类),则返回
YES
?并查看始终有趣的BNR博客:“…它非常不雅且非常慢”。。。理论上(基于继承)
mutableString是kindof类:[NSString类]
应该为true,但
nonMutableString是kindof类:[NSMutableString类]
应该为false。(但Objective-C遗传偶尔表现出一定程度的近亲繁殖。)