Objective-C'de bir nesnenin hangi sınıfta olduğunu nasıl test edebilirim?


207

Bir nesnenin Objective-C'de belirli bir sınıfın örneği olup olmadığını nasıl sınayabilirim? Diyelim ki a nesnesinin b sınıfı mı yoksa c sınıfı örneği mi olduğunu görmek istiyorum, bunu nasıl yapabilirim?

Yanıtlar:


345

Nesnenin a sınıfı bir örnek olup olmadığını test etmek için:

[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.

veya

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

Nesnenin sınıf adını almak için NSStringFromClassişlevi kullanabilirsiniz :

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

veya objektif-c çalışma zamanı api'sinden c-fonksiyonu:

#import <objc/runtime.h>

/* ... */

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

EDIT: Hızlı

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

69
class_getName ()
Ovesh

6
Bunun için bir sınıf yöntemi de vardır .
Alexander Wallin

3
Benim anlayışım bunun sadece NSObject'i devralan nesneler için geçerli olduğudur.
Henrik P. Hessel

1
@afEkenholm - ancak iOS 4.x'te değil, biliyoruz.
JJ Rohrer

2
class_getNameÜzerinden kullanmanın avantajı nedir NSStringFromClass? Eğer yoksa, bu cevap ayarlanmalıdır.
Dan Rosenstark

21

Ayrıca kullanabilirsiniz

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

herhangi bir NSObject'te


8
Bu, programlayıcının açıklama yöntemini geçersiz kılıp kılmadığına bağlı olarak çalışabilir veya çalışmayabilir. Yine de [object class] veya NSStringFromClass kullanımı sınıf adını döndürür.
futureelite7

1
Hata ayıklama ve gizemli nesnenin ne tür olduğunu bilmek için iyi!
M Jesse

3

Apple Documentation içindeki isKindOfClass hakkında ne demek

Sınıf yöntemiyle temsil edilen nesnelerde bu yöntemi kullanırken dikkatli olun. Sınıf kümelerinin doğası gereği, geri aldığınız nesne her zaman beklediğiniz tür olmayabilir. Sınıf kümesi döndüren bir yöntemi çağırırsanız, yöntem tarafından döndürülen tam tür, bu nesne ile yapabileceklerinizin en iyi göstergesidir. Örneğin, bir yöntem bir NSArray nesnesine bir işaretçi döndürürse, dizinin değiştirilebilir olup olmadığını aşağıdaki kodda gösterildiği gibi görmek için bu yöntemi kullanmamalısınız:

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

Kodunuzda bu tür yapıları kullanırsanız, gerçekte değiştirilmemesi gereken bir nesneyi değiştirmenin uygun olduğunu düşünebilirsiniz. Bunu yapmak, nesnenin değişmeden kalmasını bekleyen diğer kodlar için sorun yaratabilir.


Örnek kodunuz doğru değil. Sadece NSArray'ı test ederseniz sorun yaşarsınız, ki bu yine de değişmez. Belirli bir sınıfı test etmek istiyorsanız, bunun yerine isMemberOfClass kullanmalısınız.
14:02

@ Bu nasıl bir örneğidir futureelite7 olmayan testi için sınıf türü. Elma dokümantasyon devletler -isKindOfClass:& -isMemberOfClass:sınıf küme içindeki nesneleri tanımlamak için kullanılmamalıdır.
pxpgraphics

3

Belirli bir sınıfı kontrol etmek istiyorsanız şunu kullanabilirsiniz:

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

1

sınıfın adını almak istiyorsanız sadece arayın: -

id yourObject= [AnotherClass returningObject];

NSString *className=[yourObject className];

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

0

Ayrıca çalışma süresini de kontrol edebilirsiniz. Kod ve iç (lldb) konsol yazma içine bir kesme noktası koymak

(lldb) po [yourObject class]

Bunun gibi..

resim açıklamasını buraya girin

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.