Sự khác biệt của iOS giữa isKindOfClass và isMemberOfClass


152

Sự khác biệt giữa isKindOfClass:(Class)aClasscác isMemberOfClass:(Class)aClasschức năng là gì? Tôi biết nó là một cái gì đó nhỏ như, một cái là toàn cầu trong khi cái kia là một lớp phù hợp chính xác nhưng tôi cần ai đó chỉ định cái nào vui lòng.

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

Câu trả lời:


264

isKindOfClass:trả về YESnếu người nhận là một thể hiện của lớp được chỉ định hoặc một thể hiện của bất kỳ lớp nào kế thừa từ lớp được chỉ định.

isMemberOfClass:trả về YESnếu và chỉ khi, người nhận là một thể hiện của lớp được chỉ định.

Hầu hết thời gian bạn muốn sử dụng isKindOfClass:để đảm bảo rằng mã của bạn cũng hoạt động với các lớp con.

Các NSObject chiếu giao thức nói nhiều hơn một chút về những phương pháp này.


Bạn có thể vui lòng xóa nghi ngờ dưới đây của tôi? if ([lbl.textColor isMemberOfClass: [UIColor class]]) {// Không phải Memeber NSLog (@ "Không phải Memeber"); } other {NSLog (@ "Không phải là bộ nhớ"); } if ([imgView.image isMemberOfClass: [UIImage class]]) {// Memeber NSLog (@ "Memeber"); } other {NSLog (@ "Không phải là bộ nhớ"); }
Nikkie

82
  • isKindOfClass:cho biết liệu một đối tượng có kế thừa từ một lớp nhất định không
  • isMemberOfClass:cho biết liệu một đối tượng là một thể hiện của một lớp nhất định.

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

@Durga, nếu điều này trả lời câu hỏi của bạn, bạn nên chấp nhận nó. Đọc thêm về tỷ lệ chấp nhận tại đây: meta.stackexchange.com/questions/16721/iêu
poncha

1
isKindOfClass cũng sẽ trả về CÓ nếu đối tượng là một thể hiện của một lớp nhất định. Nói cách khác, isMemberOfClass là tập con của isKindOfClass.
Xe tay ga

48

Giả sử

@interface A : NSObject 
@end

@interface B : A
@end

...

id b = [[B alloc] init];

sau đó

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

Về cơ bản, -isMemberOfClass:là đúng nếu thể hiện là chính xác của lớp được chỉ định, trong khi đó -isKindOfClass:là đúng nếu thể hiện đó chính xác là của lớp được chỉ định hoặc nếu một trong các tổ tiên của thể hiện là của lớp được chỉ định.

-isMemberOfClass: hiếm khi được sử dụng.


1
Nhưng nếu bạn có một loạt các cuộc phỏng vấn bao gồm UIViews và UISegmentedControl và bạn đã lặp qua chúng và đặt một điều kiện trên lớp, bạn sẽ cần sử dụng isMemberOfClas UIView và isMemberOfClass UISegmentedControl để phân biệt giữa chúng, không? isKindOfClass sẽ xem UISegmentedControl là một UIView.
PruitIgoe

@Pbeanlgoe điều đó rất đúng. Bạn có thể sử dụng isKindOfClass: [Lớp UIView] để đảm bảo rằng tất cả các đối tượng bạn đang xử lý là UIView nhưng bạn sẽ cần sử dụng isMemberOfClass: [lớp UIView] và / hoặc isMemberOfClass: [UISegmentedControl] về số lượt xem dựa trên lớp cá thể ngay lập tức của họ
NoodleOfDeath

9

isKindOfClass : Trả về giá trị Boolean cho biết người nhận là một thể hiện của lớp đã cho hay một thể hiện của bất kỳ lớp nào kế thừa từ lớp đó.

isMemberOfClass : Trả về giá trị Boolean cho biết người nhận có phải là một thể hiện của một lớp nhất định hay không.


2

isKindOfClass-> trả về CÓ khi đối tượng là thể hiện của lớp đó hoặc thể hiện của một lớp được kế thừa từ nó.

isMemberOfClass: trả về CÓ khi đối tượng là thể hiện của lớp đó nhưng Không có trong trường hợp: thể hiện của một lớp được kế thừa từ nó.

ví dụ là đủ tốt trong câu trả lời của jtbandes.


0

Do các cụm lớp, isMemberOfClass có thể cung cấp cho bạn một câu trả lời mà bạn có thể không mong đợi. Trong nhiều trường hợp, sự lựa chọn tốt nhất của bạn có nhiều khả năng là - (BOOL) tuân thủToProtocol: (SEL) aSelector hoặc - (BOOL) tuân thủToProtocol: (Protocol *) aProtocol. Tức là, tốt hơn hết là kiểm tra những thứ này nếu chúng có thể đáp ứng nhu cầu của bạn hơn là kiểm tra lớp / lớp con.

Xem tài liệu apple cho lớp và giao thức NSObject:

http://developer.apple.com/l Library / mac / documentation / Coloa / Reference / Foundation / Class / NSObject_Class / Reference / Reference.html # / // bit_Vf /occ / cl / NSObject

http://developer.apple.com/l Library / mac / documentation / Coloa / Reference / Foundation / Prot Protocol / NSObject_Protatio / Reference / NSObject.html # / //pleplef / occ / intf / NNSO

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.