isKindOfClass ve isMemberOfClass arasındaki iOS farkı


152

isKindOfClass:(Class)aClassVe isMemberOfClass:(Class)aClassfonksiyonları arasındaki fark nedir ? Küçük bir şey olduğunu biliyorum, biri küreselken diğeri tam bir sınıf maçı ama hangisinin hangisi lütfen belirtmek için birine ihtiyacım var.

Swift isKind(of aClass: AnyClass)ve isMember(of aClass: AnyClass).

Yanıtlar:


264

isKindOfClass:döner YESalıcı ise bir örneğidir belirtilen sınıftan veya herhangi bir sınıfın bir örneği, bu devralır belirtilen sınıftan.

isMemberOfClass:YESyalnızca alıcı belirtilen sınıfın bir örneğiyse döndürür .

Çoğu zaman isKindOfClass:kodunuzun alt sınıflarla da çalıştığından emin olmak için kullanmak istersiniz .

NSObject Protokol Referansı Bu yöntemler hakkında biraz daha konuşuyor.


Lütfen aşağıdaki şüphemi giderebilir misiniz? if ([lbl.textColor isMemberOfClass: [UIColor class]])) {// Memeber Değil NSLog (@ "Memeber Değil"); } başka {NSLog (@ "Memeber değil"); } if ([imgView.image isMemberOfClass: [UIImage class]])) {// Memeber NSLog (@ "Memeber"); } başka {NSLog (@ "Memeber değil"); }
Nikkie

82
  • isKindOfClass:bir nesnenin belirli bir sınıftan miras alıp almadığını gösterir
  • isMemberOfClass:bir nesnenin belirli bir sınıfın örneği olup olmadığını gösterir .

[[NSMutableData data] isKindOfClass:[NSData class]]; // YES
[[NSMutableData data] isMemberOfClass:[NSData class]]; // NO

@Durga, bu sorunuza cevap veriyorsa, kabul etmelisiniz. Oranı kabul etme hakkında daha fazla bilgiyi buradan edinebilirsiniz: meta.stackexchange.com/questions/16721/…
poncha

1
Nesne belirli bir sınıfın örneğiyse isKindOfClass da YES döndürür. Başka bir deyişle isMemberOfClass, isKindOfClass öğesinin bir alt kümesidir.
Scooter

48

varsaymak

@interface A : NSObject 
@end

@interface B : A
@end

...

id b = [[B alloc] init];

sonra

[b isKindOfClass:[A class]] == YES;
[b isMemberOfClass:[A class]] == NO;

Temel olarak, -isMemberOfClass:örnek tam olarak belirtilen sınıftaysa, -isKindOfClass:örnek tam olarak belirtilen sınıftaysa veya örneğin atalarından biri belirtilen sınıftaysa doğrudur.

-isMemberOfClass: nadiren kullanılır.


1
Ancak, UIViews ve bir UISegmentedControl içeren bir dizi alt görünümünüz varsa ve bunlardan geçip sınıfta bir koşul belirlediyseniz, bunları ayırmak için isMemberOfClas UIView ve isMemberOfClass UISegmentedControl kullanmanız gerekir, değil mi? isKindOfClass, UISegmentedControl'ü bir UIView olarak görür.
PruitIgoe

@Pruitlgoe bu çok doğru. Karşılaştığınız tüm nesnelerin UIViews olmasını sağlamak için isKindOfClass: [UIView sınıfı] kullanabilirsiniz, ancak belirli bir uygulamayı belirtmek için bazı koşullu ifadelerde isMemberOfClass: [UIView sınıfı] ve / veya isMemberOfClass: [UISegmentedControl sınıfı] kullanmanız gerekir örnek sınıflarına dayanan görüşlerin açıklaması
NoodleOfDeath

9

isKindOfClass : Alıcının belirli bir sınıf örneği mi yoksa o sınıftan miras alan herhangi bir sınıf örneği mi olduğunu gösteren bir Boolean değeri döndürür.

isMemberOfClass : Alıcının belirli bir sınıfın örneği olup olmadığını gösteren bir Boolean değeri döndürür.


2

isKindOfClass-> nesnesi o sınıfın örneği veya ondan devralınan bir sınıf örneği olduğunda YES değerini döndürür.

isMemberOfClass: nesne bu sınıfın bir örneği olduğunda YES'i döndürür, ancak durumda: ondan devralınan bir sınıf örneği.

jtbandes cevap örnek yeterince iyidir.


0

Sınıf kümeleri nedeniyle, isMemberOfClass size beklemeyeceğiniz bir cevap verebilir. Çoğu durumda en iyi seçiminizin - (BOOL), TOProtocol'a uygun olması daha olasıdır: (SEL) aSelector veya - (BOOL), Protokol: (Protokol *) aProtokole uygundur. Yani, sınıfı / alt sınıfı test etmek yerine ihtiyaçlarınıza cevap verip vermediklerini test etmek daha iyidir.

NSObject sınıfı ve protokolü için apple doc'ye bakın:

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/cl/NSObject

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intf/NSObject

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.