Làm cách nào để kiểm tra lớp nào của một đối tượng trong Objective-C?


207

Làm cách nào để kiểm tra xem một đối tượng có phải là một thể hiện của một lớp cụ thể trong Objective-C không? Hãy nói rằng tôi muốn xem nếu đối tượng a là một thể hiện của lớp b hoặc lớp c, làm thế nào để tôi thực hiện nó?

Câu trả lời:


345

Để kiểm tra xem đối tượng có phải là một thể hiện của lớp a:

[yourObject isKindOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of 
// given class or an instance of any class that inherits from that class.

hoặc là

[yourObject isMemberOfClass:[a class]]
// Returns a Boolean value that indicates whether the receiver is an instance of a 
// given class.

Để có được tên lớp của đối tượng, bạn có thể sử dụng NSStringFromClasshàm:

NSString *className = NSStringFromClass([yourObject class]);

hoặc hàm c từ api thời gian chạy mục tiêu-c:

#import <objc/runtime.h>

/* ... */

const char* className = class_getName([yourObject class]);
NSLog(@"yourObject is a: %s", className);

EDIT: Trong Swift

if touch.view is UIPickerView {
    // touch.view is of type UIPickerView
}

69
đừng quên #import <objc / runtime.h> cho class_getName ()
Ovesh

6
Ngoài ra còn có một phương pháp lớp cho việc này.
Alexander Wallin

3
Tôi hiểu rằng điều này chỉ hoạt động cho các đối tượng kế thừa NSObject.
Henrik P. H ship

1
@afEkenholm - nhưng không phải trên iOS 4.x, chỉ để chúng tôi biết.
JJ Rohrer

2
Lợi thế của việc sử dụng class_getNamehơn là NSStringFromClassgì? Nếu không có, câu trả lời này nên được điều chỉnh.
Dan Rosenstark

21

Bạn cũng có thể sử dụng

NSString *className = [[myObject class] description]; 

trên mọi NSObject


8
Điều này có thể hoặc không thể hoạt động dựa trên việc lập trình viên có ghi đè phương thức mô tả hay không. Mặc dù vậy, sử dụng [lớp đối tượng] hoặc NSStringFromClass luôn trả về tên lớp.
Futureelite7

1
Tốt để gỡ lỗi và biết loại đối tượng bí ẩn của bạn là gì!
M Jesse

3

Điều gì có nghĩa là isKindOfClass trong Tài liệu Apple

Hãy cẩn thận khi sử dụng phương thức này trên các đối tượng được đại diện bởi một cụm lớp. Do tính chất của các cụm lớp, đối tượng bạn nhận lại có thể không phải luôn là loại bạn mong đợi. Nếu bạn gọi một phương thức trả về một cụm lớp, loại chính xác được trả về bởi phương thức đó là chỉ báo tốt nhất về những gì bạn có thể làm với đối tượng đó. Ví dụ: nếu một phương thức trả về một con trỏ tới một đối tượng NSArray, bạn không nên sử dụng phương thức này để xem mảng có thể thay đổi được không, như được hiển thị trong đoạn mã sau:

// DO NOT DO THIS!
if ([myArray isKindOfClass:[NSMutableArray class]])
{
    // Modify the object
}

Nếu bạn sử dụng các cấu trúc như vậy trong mã của mình, bạn có thể nghĩ rằng việc sửa đổi một đối tượng mà trong thực tế không nên sửa đổi là ổn. Làm như vậy sau đó có thể tạo ra các vấn đề cho mã khác dự kiến ​​đối tượng sẽ không thay đổi.


Mã ví dụ của bạn không chính xác. Bạn sẽ chỉ gặp vấn đề nếu bạn kiểm tra NSArray, điều này là bất biến. Nếu bạn muốn kiểm tra một lớp cụ thể, bạn nên sử dụng isMemberOfClass thay thế.
Futureelite7

@ Futureelite7 Đây là một ví dụ về cách không kiểm tra loại lớp. Các tài liệu hướng dẫn của Apple bang mà -isKindOfClass:& -isMemberOfClass:không nên được sử dụng để xác định đối tượng trong một cụm lớp.
pxpgraphics

3

Nếu bạn muốn kiểm tra một lớp cụ thể thì bạn có thể sử dụng

if([MyClass class] == [myClassObj class]) {
//your object is instance of MyClass
}

1

nếu bạn muốn lấy tên của lớp, chỉ cần gọi: -

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

NSLog(@"Class name is : %@",className);

0

Bạn cũng có thể kiểm tra thời gian chạy. Đặt một điểm dừng trong mã và bên trong bảng điều khiển (lldb)

(lldb) po [yourObject class]

Như thế này..

nhập mô tả hình ảnh ở đây

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.