ฉันจะทดสอบคลาสของวัตถุใดใน Objective-C


207

ฉันจะทดสอบว่าวัตถุเป็นตัวอย่างของคลาสเฉพาะใน Objective-C ได้อย่างไร สมมติว่าฉันต้องการดูว่าวัตถุ a เป็นตัวอย่างของคลาส b หรือคลาส c ฉันจะดำเนินการได้อย่างไร

คำตอบ:


345

เพื่อทดสอบว่าวัตถุเป็นอินสแตนซ์ของคลาส 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.

หรือ

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

ในการรับชื่อคลาสของวัตถุคุณสามารถใช้NSStringFromClassฟังก์ชัน:

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

หรือ c-function จาก runtime-c runtime api:

#import <objc/runtime.h>

/* ... */

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

แก้ไข: อย่างรวดเร็ว

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

69
อย่าลืม #import <objc / runtime.h> สำหรับ class_getName ()
Ovesh

6
นอกจากนี้ยังมีวิธีการเรียนสำหรับสิ่งนี้
Alexander Wallin

3
ความเข้าใจของฉันคือการทำงานเฉพาะกับวัตถุที่สืบทอด NSObject
Henrik P. Hessel

1
@afEkenholm - แต่ไม่ใช่ใน iOS 4.x เราก็รู้
JJ Rohrer

2
ประโยชน์ที่จะได้รับจากการใช้class_getNameเกินNSStringFromClassคืออะไร? หากไม่มีเลยคำตอบนี้ควรถูกปรับ
Dan Rosenstark

21

คุณยังสามารถใช้

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

ใน NSObject ใด ๆ


8
สิ่งนี้อาจหรืออาจไม่ทำงานโดยขึ้นอยู่กับว่าโปรแกรมเมอร์ได้เขียนทับวิธีการอธิบาย แม้ว่าการใช้ [object class] หรือ NSStringFromClass จะส่งคืนชื่อคลาสเสมอ
futureelite7

1
ดีสำหรับการดีบั๊กและการรู้ว่าวัตถุลึกลับของคุณคืออะไร!
M Jesse

3

isKindOfClassใน Apple Documentation หมายถึงอะไร

ระวังเมื่อใช้วิธีนี้กับวัตถุที่เป็นตัวแทนของคลาสคลัสเตอร์ เนื่องจากลักษณะของคลาสกลุ่มวัตถุที่คุณได้รับอาจไม่ได้เป็นประเภทที่คุณคาดหวังเสมอไป ถ้าคุณเรียกใช้เมธอดที่ส่งคืนคลาสคลัสเตอร์ชนิดที่แน่นอนที่ส่งคืนโดยเมธอดเป็นตัวบ่งชี้ที่ดีที่สุดของสิ่งที่คุณสามารถทำได้กับวัตถุนั้น ตัวอย่างเช่นถ้าเมธอดส่งคืนพอยน์เตอร์ไปยังวัตถุ NSArray คุณไม่ควรใช้วิธีนี้เพื่อดูว่าอาร์เรย์ไม่แน่นอนหรือไม่ดังที่แสดงในรหัสต่อไปนี้:

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

หากคุณใช้โครงสร้างดังกล่าวในรหัสของคุณคุณอาจคิดว่าเป็นเรื่องดีที่จะแก้ไขวัตถุที่จริงแล้วไม่ควรแก้ไข การทำเช่นนั้นอาจสร้างปัญหาสำหรับรหัสอื่นที่คาดว่าวัตถุจะยังคงไม่เปลี่ยนแปลง


รหัสตัวอย่างของคุณไม่ถูกต้อง คุณจะพบปัญหาเฉพาะเมื่อคุณทดสอบ NSArray ซึ่งไม่สามารถเปลี่ยนรูปแบบได้ ถ้าคุณต้องการทดสอบคลาสเฉพาะคุณควรใช้ isMemberOfClass แทน
futureelite7

@ futureelite7 นี่เป็นตัวอย่างของการไม่ทดสอบประเภทชั้นเรียน เอกสารแอปเปิ้ลระบุว่า-isKindOfClass:และ-isMemberOfClass:ไม่ควรนำมาใช้ในการระบุวัตถุภายในคลัสเตอร์ชั้นเรียน
pxpgraphics

3

หากคุณต้องการตรวจสอบคลาสเฉพาะคุณสามารถใช้

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

1

ถ้าคุณต้องการได้รับชื่อของคลาสเพียงโทร: -

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

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

0

นอกจากนี้คุณยังสามารถตรวจสอบเวลาทำงาน ใส่เบรกพอยต์หนึ่งในรหัสและภายในคอนโซล (lldb) เขียน

(lldb) po [yourObject class]

แบบนี้..

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.