Bir yöntemin mevcut olup olmadığını kontrol edin


111

Objective-C'de bir yöntemin olup olmadığını test etmemin bir yolu var mı?

Çağırmadan önce nesnemin yönteme sahip olup olmadığını görmek için bir koruma eklemeye çalışıyorum.


İlk etapta bunun doğru yaklaşım olup olmadığı sorusu da var, çünkü Objective-C sınıfları bildirmedikleri (aracılığıyla - forwardInvocation:) seçicilere yanıt verebilir .
Donal Fellows

Yanıtlar:


189
if ([obj respondsToSelector:@selector(methodName:withEtc:)]) {
   [obj methodName:123 withEtc:456];
}

72

Ayrıca statik ileti örnekleri de vardırRespondToSelector: (SEL) selector Bunu şöyle çağırırsınız:

[MyClass instancesRespondToSelector:@selector(someMethod:withParams:)]

veya bunun gibi:

[[myObject class] instancesRespondToSelector:@selector(someMethod:withParams:)]

Buna bağlı olarak bir kurucu veya başka bir kurucu çağırmak isterseniz bu yararlı olabilir (yani, örneğin kendisine sahip olmadan önce).


1
ÖrnekleriRespondToSelector ile responsesToSelector arasındaki fark nedir?
CReaTuS

1
Temel fark, birinin bir örnek mesajı (belirlenmiş bir örnek mesajının var olup olmadığını test etmek için), diğerinin bir sınıf mesajı olmasıdır (belirli bir sınıf mesajının var olup olmadığını test etmek için).
Ricard Pérez del Campo

1
+1 [MyClass örnekleriRespondToSelector] için. Bir init oluşturma yönteminde buna ihtiyacım vardı: Alt sınıflandırma, başkaları yerine bir süper init yöntemini çağırmak için gerekli olduğunda (kullanımdan kaldırılanlar), çünkü self henüz oluşturulmadı ve responsesToSelector her zaman NO döndürecektir.
Lightman

12

Kullanın respondsToSelector:. Gönderen belgeler :

respondsToSelector:

Alıcının belirtilen bir iletiye yanıt verebilecek bir yöntemi uygulayıp uygulamadığını veya miras alıp almadığını gösteren bir Boolean değeri döndürür.

- (BOOL)respondsToSelector:(SEL)aSelector

Parametreler
aSelector - Bir mesajı tanımlayan bir seçici.


YESAlıcı , aksi takdirde , aSelector'a yanıt verebilecek bir yöntemi uygular veya devralırsa Dönüş DeğeriNO .


10

Şu yanıtları arıyorsunuz : -

if ([foo respondsToSelector: @selector(bar)] {
  [foo bar];
}

As Donal diyor Yukarıdaki foo yapılamayacağını belirten kesinlikle çubuğu seçici alma kolu. Bununla birlikte, eğer foo, bar mesajını alacak olan bazı temel nesneye bar ileten bir proxy ise, o zaman responseToSelector: mesaj çubuğa yanıt veren bir nesneye iletilecek olsa bile size HAYIR diyecektir.


1

ResponsesToSelector ile seçicilerin denetlenmesi normalde yalnızca temsilci yöntemleri içindir. Temsilci yöntemleri için forwardInvocation veya proxy kullanmamalısınız. ResponsesToSelector'ı başka durumlarda kullanmanız gerekirse, programınızı tasarlamak için daha uygun bir yol olmadığından emin olmak isteyebilirsiniz.

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.