2009-07-16 29 views
64
)

-respondsToSelector:'a eşdeğer bir sınıf yöntemi var mı?Sınıf yöntemi, karşılık 1 (

+respondsToSelector: gibi bir şey?

Sormamın nedeni, bir sınıf düzeyinde -respondsToSelector: uygulanarak, bir derleyici uyarısı almamdır: "protokolde" + yanıtlarToSelector: 'yerine "--respondsToSelector:".

kod şuna benzer: Eğer mümkün olmalıdır böylece

Class <SomeProtocol> someClass = [someInstance class]; 

if ([someClass respondsToSelector:@selector(someSelector:)]) { 
    someVar = [someClass someSelector:someData]; 
} 

cevap

80

Güncelleme yapmak düzenleyiniz:

Bir sınıf nesnesi, muhtemelen farkında olduğunuz gibi respondsToSelector:'a sorun.

NSLog(@"Responds to selector? %i", [MyObject respondsToSelector:@selector(respondsToSelector:)]); 
NSLog(@"Responds to selector? %i", [[MyObject class] respondsToSelector:@selector(respondsToSelector:)]); 

Ancak, değişkeni bir protokol ilan ettik, bu yüzden sen tutuyorsun sınıf nesnesi olanlar uygular etmek olduğunu varsayar: Bir test uygulamasında, herhangi bir derleyici uyarı gösterilmeden aşağıdakilerden hem yapabilirsiniz yöntemleri. En basit çözüm, respondsToSelector: numaralı telefonu aramak için 'u id olarak yayınlamaktır. Biraz daha temiz bir çözüm +respondsToSelector:(SEL)selector beyan kendi @protocol beyan ve aşağıdaki gibi daha sonra someClass ilan etmek olacaktır:

Class<SomeProtocol, ClassRespondingToSelector> someClass = ... 

Son olarak, http://bugreporter.apple.com de bir hata ile Apple Dosya emin olun. Ne yaptığınızı çok net bir şekilde görebilmek için basit bir test uygulaması ekleyin. Düzeltmeleri önceliklendirmelerine yardımcı olarak geçmişte gönderildiyse bile bu tür hata raporlarını memnuniyetle karşılıyorlar.

Son Not: Bu muhtemelen çünkü teoride oluyor, sen NSObject tamamen ayrı bir kök nesnesi uygulamak seçtiğiniz olabilir ve bu durumda, bu olmaz cevap -respondsToSelector: için. -[NSObject respondsToSelector:] aslında sınıf tanımı değil, NSObject protokolünde bildirilmiştir. NSObject protokolü aslında aslında NSObject olarak bildiklerinizin çoğunu yaşıyor. Biri +respondsToSelector:'un da orada olması gerektiğini iddia edebilir, ancak şu an itibariyle değil. Ve bir protokol listesi sağladığınızdan ve yöntem burada olmadığından, ne yaptığınızı bildiğinizden emin olmak için size bir uyarı verir.

+0

Bu durumda, aslında Class'a değil id'ye atılmak istediğine inanıyorum. –

+7

Bu, kaldırılmış işlevselliktir veya yanıt belirsizdir. 'Class', yanıtlaToSelector:' yanıt vermiyor. – RileyE

+0

Deneyin. Üstbilgisinde değil, ancak classObject = [SomeClass sınıfı]; [classObject ,ToSelector'a cevap veriyor:] ' –

9

Eh bir sınıf yöntemi, sınıf nesnesinin sadece bir yöntemdir sadece gördükten sonra bu

[MyClass respondsToSelector:@selector(...)] 
+0

gibi davranacaktır Hangi kullanabilirsiniz (lar)". Bu derleyici uyarısından nasıl kurtulurum? – firstresponder

+0

Protokol tipi niteleyici '' bırakılarak derleyici uyarısından kurtulabilirim. Neden? Bu sözdizimi doğru değil mi? – firstresponder

+3

firstresponder: Objective-C dinamik bir dildir. Bu tür bir sınıfa (bir protokol ile) hak kazanmadan bir 'Class' veya' id' öğesine bir mesaj gönderirseniz, derleyici bir çeşit cevaplayıcıya çevirdiğini veya sınıfının aynısını kontrol ettiğinizi varsayar. . Ancak, bir protokol ya da (örnekler için) belirli bir sınıf belirtirseniz, yardımcı olur ve sizin için denetimi gerçekleştirir. Değişkeni bildirdiğiniz protokol ile bir '+ responssToSelector:' deklarasyonuna sahip olmadığından, derleyici bir uyarı verir. –

1

Ne düşündüğünüzü düşünüyorum: +someMethod'a yanıt veriyorsa bir ders mi sorabilir misiniz?

[ [ UIView class ] respondsToSelector: @selector(buttonWithType:) ] -> NO 
[ [ UIButton class ] respondsToSelector: @selector(buttonWithType:) ] -> YES 

Ama arzu edildiği gibi ne Yukarıda yazdım çalışmaz: Başka bir deyişle, Cocoa Touch API'larından düşünme, istediğiniz olacaktır. respondsToSelector: sadece örnek yöntemlerle ilgilidir. (Böylece, her iki çağrı da NO döndürecektir.) Kakao API'lerinde bir sınıf için respondsToSelector: eşdeğeri yoktur. Ancak, class_getClassMethod numaralı telefonu arayabilirsiniz. Sonuç NULL olmayansa, hakkında sorduğunuz sınıf yöntemi var ve onu arayabilirsiniz.

+8

Bu yanlıştır. 'cevap verirToSelector:' sınıf yöntemlerinin varlığını bildirmek için 'Class' nesnelerini kullanır. –

+0

Bu ahbayı oyladım, çünkü 'class_getClassMethod' yaklaşımıyla aslında doğruydu. Eğer tüm parçayı okumak için yeterli sabrım olsaydı, aynı çözümü yeniden icat etmek zorunda kalmazdım. – bioffe

+1

Bunu reddediyorum çünkü sınıf yöntemleri * sınıf nesnesinde * örnek yöntemleridir. – user102008

0

Objective C'de nesneler de nesnelerdir, böylece nesne mesajlarını gönderebilirsiniz. Özellikle, bir sınıfa -respondsToSelector: sorabilirsiniz. Yine de sınıf düzeyi olmayan nesnelere sınıf düzeyinde yöntemler gönderemezsiniz.

5

iOS 2.0'dan beri aşağıdaki instancesRespondToSelector:'u kullanabilirsiniz, böylece bir sınıfın örneğiyle yapabileceğiniz; "Bulunan '-respondsToSelector:' yerine '+ respondsToSelector:' protokolünde

bir sınıf ile
[myInstance respondsToSelector: @selector(...)]; 

Eğer

[myClass instanceRespondsToSelector: @selector(...)]; 
// or 
[[myInstance class] instanceRespondsToSelector: @selector(...)]; 

bir derleyici uyarı olsun +(BOOL) respondsToSelector

+6

Eğer sınıfın kendisi seçiciye statik olarak cevap verse de, sınıfın örnekleri seçiciye cevap verirse bu cevap verecekti. – Jonny

İlgili konular