任何人可以告诉我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. iPhone和iPod Touch之间的差异
- 3. UIImagePickerController与iPhone和iPad之间的差异
- 4. iPhone OS v2和v4之间的差异?
- 5. VBA:&和+之间的差异
- 6. 之间的差异和::: ++
- 7. PHP:差异之间 - >和::
- 8. 将元素垂直添加到scrollview:差异在Java和iPhone SDK之间?
- 9. iPhone SDK,计算给定时间之间的时间差
- 10. Android和Windows版本的Android SDK之间是否存在差异?
- 11. Url.Action和Html.RenderActionLink和Html.RenderAction之间的差异
- 12. iphone - [[自我tabBarController] navigationController]和self.navigationController之间的差异
- 13. iPhone/iPod模拟器和设备之间的差异
- 14. C和C++之间的链接差异?
- 15. JSONLint和PHP之间的差异JSON_DECODE
- 16. cabal包之间的差异readPackageDescription和parsePackageDescription
- 17. CrudRepository findOne()和JpaRepository getOne()之间的差异
- 18. SAS和R之间的输出差异
- 19. OT和CRDT之间的差异
- 20. spawn/1和spawn/3之间的差异
- 21. Array&Session - var和$ var之间的差异
- 22. VS008和VS0210之间的MFC差异
- 23. Silverlight 2.0和3.0之间的差异
- 24. SwingWorker和Executor之间的差异
- 25. PHP和MySQL之间的时区差异
- 26. Blackberry Webworks和Phonegap之间的差异
- 27. ngDialog - open和openConfirm之间的差异
- 28. java.awt。*和java.awt.event。*之间的差异
- 29. Module#const_set和Module#之间的差异module_eval
- 30. iOS 5.1和6.1之间的UIButton差异
能否请你清楚我下面疑惑?如果([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