在 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");
執行結果 |
沒有留言:
張貼留言