任何人可以告訴我isKindOfClass:(Class)aClass
和isMemberOfClass:(Class)aClass
函數之間的區別是什麼? 我知道這是一個小的喜歡,一個是全球性的,而另一個是確切的類比賽,但我需要有人指定哪個是請。isKindOfClass和isMemberOfClass之間的iPhone SDK差異
回答
isKindOfClass:
如果接收方是指定類的實例或從指定類繼承的任何類的實例,則返回YES。
isMemberOfClass:
如果接收方是指定類的實例,則返回YES。
大多數情況下,您想使用isKindOfClass:
來確保您的代碼也適用於子類。
NSObject Protocol Reference對這些方法進行了一些討論。
假設
@interface A : NSObject
@end
@interface B : A
@end
...
id b = [[B alloc] init];
然後
[b isKindOfClass:[A class]] == YES;
[b isMemberOfClass:[A class]] == NO;
基本上,-isMemberOfClass:
爲真,如果實例是完全指定的類的,而-isKindOfClass:
爲真,如果實例是完全指定的類,或者如果其中一個實例的祖先是指定的類。
-isMemberOfClass:
很少使用。
但是,如果你有一個包含UIViews和UISegmentedControl的子視圖數組,並且你通過它們遍歷並設置了一個條件類,你將需要使用isMemberOfClas UIView和isMemberOfClass UISegmentedControl來區分它們,不是嗎? isKindOfClass會將UISegmentedControl視爲UIView。 – PruitIgoe 2013-08-01 18:36:09
@Pruitlgoe這是非常真實的。你可以使用isKindOfClass:[UIView class]來確保你處理的所有對象都是UIViews,但是你需要在一些條件語句中使用isMemberOfClass:[UIView class]和/或isMemberOfClass:[UISegmentedControl class]來指示任何不同的實現根據他們的立即類實例 – 2014-07-02 13:48:38
isKindOfClass:
指示對象是否從一個給定的類isMemberOfClass:
繼承指示對象是否是一個給定的類的實例。
[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO
@Durga,如果這回答你的問題,你應該接受它。閱讀更多關於接受率的信息:http://meta.stackexchange.com/questions/16721/how-does-accept-rate-work – poncha 2013-01-18 15:25:41
isKindOfClass:返回一個布爾值,它指示 接收機是否是給定的類的一個實例或從該類繼承的任何類 的一個實例。
isMemberOfClass:返回一個布爾值,指示 接收方是否是給定類的實例。
isKindOfClass->當對象是該類的實例或從其繼承的類的實例時返回YES。
isMemberOfClass:return當對象是該類的實例時返回YES,但如果是:從其繼承的類的實例。
這個例子在jtbandes的答案中已經足夠了。
由於類集羣,isMemberOfClass可以給你一個你可能不會期待的答案。在許多情況下,你的最佳選擇更可能是 - (BOOL)conformsToProtocol:(SEL)aSelector或 - (BOOL)conformsToProtocol:(Protocol *)aProtocol。也就是說,如果能夠回答你的需求而不是測試類/子類,那麼測試它們會更好。
看到蘋果文檔的NSObject類和協議:
- 1. SDK和NDK之間的差異在android
- 2. ESP8266_RTOS_SDK和esp-open-sdk之間的差異
- 3. iPhone OS v2和v4之間的差異?
- 4. iPhone和iPod Touch之間的差異
- 5. UIImagePickerController與iPhone和iPad之間的差異
- 6. /和/ **之間的差異
- 7. PHP之間的差異()和[]
- 8. '//'和'///'之間的C++差異
- 9. VBA:&和+之間的差異
- 10. 之間的差異和::: ++
- 11. 運算符「==」和「=」之間的差異運算符「==」和「=」之間的差異「==」和「=」
- 12. PHP:差異之間 - >和::
- 13. Swift is和isKindOfClass()之間的區別?
- 14. 將元素垂直添加到scrollview:差異在Java和iPhone SDK之間?
- 15. iPhone SDK,計算給定時間之間的時間差
- 16. Sapi 5.4和Microsoft Speech Platform SDK 11之間的差異
- 17. Windows SDK和MSDN文檔之間的SAL註釋差異
- 18. Android和Windows版本的Android SDK之間是否存在差異?
- 19. 模擬器和Eclipse SDK視圖佈局之間的Android差異
- 20. Htaccess - 和*之間的差異:。*和。+
- 21. 總和和+之間的差異?
- 22. Url.Action和Html.RenderActionLink和Html.RenderAction之間的差異
- 23. iphone - [[自我tabBarController] navigationController]和self.navigationController之間的差異
- 24. iPhone/iPod模擬器和設備之間的差異
- 25. iPhone差異處理設備和模擬器之間的圖像
- 26. Serilog:之間{..} {差異@ ..}
- 27. Elf32_Phdr的p_filesz和p_memsz之間的差異
- 28. Go和Cython之間的差異
- 29. vcruntime140d_app.dll和vcruntime140d.dll之間的差異
- 30. RestKit和AFIncrementalStore之間的差異
能否請你清楚我下面疑惑?如果([lbl.textColor isMemberOfClass:[UIColor class]]){// Not Memeber NSLog(@「Not Memeber」);其他{ } NSLog(@「Not Memeber」); } if([imgView.image isMemberOfClass:[UIImage class]]){// Memeber NSLog(@「Memeber」);其他{ } NSLog(@「Not Memeber」); } – Nikkie 2014-12-19 14:39:04