ObjC中怎麼判斷可變和不可變,objc判斷可變不可

來源:互聯網
上載者:User

ObjC中怎麼判斷可變和不可變,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。

  轉注出:原文

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.