ObjC中怎麼判斷可變和不可變 怎麼判斷NSString和NSMutableString呢? 請聽題 這很簡單當然選B的,字元串常量是NSString。所以正確答案是A,是不是有種高考題的趕腳。建議這題出面試。 首先應該百度objc的類簇概念,然後是工廠模式。這篇筆記只講怎麼判斷,開個傳送門自己去打 ...
ObjC中怎麼判斷可變和不可變
怎麼判斷NSString和NSMutableString呢?
請聽題
BOOL result = [@"123" isKindOfClass:[NSMutableString class]]; // A:YES B:NO
這很簡單當然選B的,字元串常量是NSString。所以正確答案是A,是不是有種高考題的趕腳。建議這題出面試。
首先應該百度objc的類簇概念,然後是工廠模式。這篇筆記只講怎麼判斷,開個傳送門自己去打怪。
看控制台弄出來的結果
id str0 = [NSString alloc];//NSPlaceholderString->NSString id str1 = [[NSString alloc] init];//__NSCFConstantString->__NSCFString->NSMutableString->NSString id str3 = [NSString stringWithFormat:@"123"];//NSTaggedPointerString->NSString id str4 = [NSMutableString alloc];//NSPlaceholderMutableString->NSMutableString->NSString id str5 = [NSMutableString new];//__NSCFString->NSMutableString->NSString
字元串常量,也就是str1那種創建方式得到的類型是__NSCFConstantString並且明目張膽的是NSMutableString的子類。無論如何請勇敢的質疑蘋果腦殘的設計。並且後面的Array和Dictionary就不存在這種腦殘的地方。我們無法知道到底黑盒子里有多少這種子類,根據倒推大法:
所以現在判斷一個字元串是可變的這麼寫就行了
BOOL isMutable = [str isMemberOfClass:NSClassFromString(@"__NSCFString")];//請註意是isMemberOfClass:這個方法不要用成isKindOfClass:
把Array的控制台結果也弄出來簡單的看一下
NSArray* arr0 = [[NSArray alloc] init];//__NSArray0->NSArray NSArray* arr1 = [NSArray arrayWithObject:@"123"];//__NSArrayI->NSArray NSMutableArray* arr3 = [[NSMutableArray alloc] init];//__NSArrayM->NSMutableArray->NSArray
可以發現雖然NSArray也子嗣眾多,但不會出現String那種近親亂的情況。
判斷Array是不可變的這麼寫就行了,不需要寫字元串的類型
BOOL notMutable = [arr isKindOfClass:[NSArray class]]&&![arr isKindOfClass:[NSMutableArray class]];
Dictionary的情況同NSArray。
轉註出:原文