en

hi, it seems you are using microsoft internet explorer. it doesn't match web standard and causes problems browsing this site. please please please use mozilla firefox or google chrome instead. thank you!

zh

哦哦!您正在使用Internet Explorer 瀏覽器,它與我們的網頁標準並不相容,可能會導致畫面顯示不正常。
請改用 Mozilla Firefox 或者 Google Chrome 才能正常瀏覽本網站,謝謝!

5.27.2013

取得並判斷物件的實體類別

在 Objective-C 中,所有的物件都是繼承 NSObject Class,所以 NSObject Class 也是在 Objective-C 中所有物件最頂層的超類別 SuperClass,下面示範我們就已最常被使用的 UIView Class為例,利用從 NSObject Class 中所繼承而來的方法函式,判斷該物件到底繼承或是屬於哪些類別,這些技巧也很常被使用在程式執行上,即時的查閱物件的類別並給予不同的處理方式。


獲得物件名稱
NSLog(@"%@", NSStringFromClass([UIView class]));
NSLog(@"%@", NSStringFromClass([[UIView class] superclass]));
NSLog(@"%@", NSStringFromClass([[[UIView class] superclass] superclass]));

執行結果

在上述程式碼中,我們使用 NSStringFromClass 語法將來物件的類別轉換成 NSString 型態並且傾印出來,透過 NSObject Class 中所繼承而來的方法函式「class」與「superclass」,我們可以取得目前的類別實體與它所繼承的類別實體,由執行結果可以得知,UIView Class 是繼承 UIResponder Class,而 UIResponder Class 又是繼承 NSObject Class。

當我們直接取得 NSObject Class 的超類別SuperClass 時,則會得到 null,表示 NSObject Class 並沒有繼承任何類別,是一個位於物件最頂層的單獨物件個體。
NSLog(@"%@", NSStringFromClass([[NSObject superclass] superclass]));
執行結果

ps:除了使用 NSStringFromClass 來取得 NSString 型態的類別名稱,你以也可以使用 object_getClassName 來取得 String 型態的類別名稱NSLog(@"%s", object_getClassName([UIView class]));。


isKindOfClass
isKindOfClass 用來判斷該物件欲目標物件是否屬於同一類的物件,這裡的同一類只的是同一個家族,意指該物件與目標即使存在著繼承關係,他們仍然屬於同一類。
UIView *myView = [UIView alloc];
NSLog(@"%@", [myView isKindOfClass:[UIView class]] ? @"YES" : @"NO");
NSLog(@"%@", [myView isKindOfClass:[UIResponder class]] ? @"YES" : @"NO");
NSLog(@"%@", [myView isKindOfClass:[NSObject class]] ? @"YES" : @"NO");

執行結果


isMemberOfClass
比起 isKindOfClass,isMemberOfClass 的定義就更為狹隘,它是用來判斷目標物件是否與該物件為同一種類別。
UIView *myView = [UIView alloc];

NSLog(@"%@", [myView isMemberOfClass:[UIView class]] ? @"YES" : @"NO");
NSLog(@"%@", [myView isMemberOfClass:[UIResponder class]] ? @"YES" : @"NO");
NSLog(@"%@", [myView isMemberOfClass:[NSObject class]] ? @"YES" : @"NO");

執行結果






沒有留言:

張貼留言