2011-04-07 10 views
10

invocationWithMethodSignature nesnesi invocationWithMethodSignature üzerinden invocationWithMethodSignature üzerinden niçin invocationWithMethodSignature üzerinden geçtiğini anlamıyorum.NSInvocation sınıfındaki setSelector yönteminin amacı nedir?

Bir NSInvocation nesnesi oluşturmak için aşağıdakileri yaparız:

SEL someSelector; 
NSMethodSignature *signature; 
NSInvocation *invocation; 

someSelector = @selector(sayHelloWithString:); 

//Here we use the selector to create the signature 
signature = [SomeObject instanceMethodSignatureForSelector:someSelector]; 
invocation = [NSInvocation invocationWithMethodSignature:signature]; 

//Here, we again set the same selector 
[invocation setSelector:someSelector]; 
[invocation setTarget:someObjectInstance]; 
[invocation setArgument:@"Loving C" atIndex:2]; 

Seçiciyi [SomeObject instanceMethodSignatureForSelector: someSelector];'a ve [invocation setSelector:someSelector];'a döndürdüğümüze dikkat edin.

Kaybettiğim bir şey var mı?

+1

1 - sorular (ve cevap) bir milyon kere zaten ve çözülemez anlık ileti jargon yazılı değil edilmemiştir burada bir soru görmek güzel. :-) –

+0

Bir küçük nokta: 'imza = [SomeObject instanceMethodSignatureForSelector: someSelector];' imza = [[SomeObject sınıfı] örneği olmalıMethodSignatureForSelector: someSelector]; veya imza = [SomeObject methodSignatureForSelector: someSelector]; – Brynjar

cevap

8

İmza bir seçici değildir. Bir seçici mesajın adıdır. İmza, parametreleri ve dönüş değerini tanımlar. Aynı imzaya sahip birçok seçiciniz olabilir ve bunun tersi de geçerlidir. NSMethodSignature'a bakarsanız, -selector yönteminin olmadığını unutmayın; İmzalar belirli bir seçiciyi taşımamaktadır.

Aynı seçici @selector(setLocation:), ancak farklı imzalara sahip

- (void)setLocation:(CGFloat)aLocation; 
- (void)setLocation:(MyLocation*)aLocation; 

aşağıdaki düşünün.

- (void)setX:(CGFloat)x; 
- (void)setY:(CGFloat)y; 

Bunlar aynı imzalı ama farklı seçicilere sahiptir. ObjC Programlama Dili'nden

Selectors, bunu anlamak için yararlı bir referans olabilir.

+0

Söylediklerimi alırken, dilde fazlalık var gibi görünüyor. Seçiciyi iki kez ayarlıyorum (bir kez imzada ve bir kez daha çağrı örneğinde). Ben şahsen (IMHO), imzayı (benim durumumda "someSelector" içinde tanımlanmış olan) imzayı elde etmenin daha verimli olacağını düşünüyorum. – haroldcampbell

+0

Bir seçiciden imza alamazsınız. Hedefi sorarak bir hedef ve bir seçiciden bir imza elde edebilirsiniz (hatırlayın, çalışma zamanında yeni yöntemler ve sınıflar oluşturulabilir; derleme zamanında bunlardan herhangi birini belirleyemezsiniz).Haklısın: + invocationWithTarget: selector: arguments: 'kısayol metodu (ekibimin benzer bir şey ekleyen bir kategorisi var). Aradığın kodu çağırdığı için daha verimli olmazdı, ama biraz daha kullanışlı olurdu. –

3

Bir yöntem imzası yalnızca dönüş türünü ve bağımsız değişkenlerin sayısını ve türünü tanımlar. Seçici adıyla ilgili hiçbir şey içermez. Örneğin, bu yöntemlerin hepsi sahip farklı seçicileri rağmen aynı imzaya sahip:

-(void) foo:(NSString*)fooString; 
-(void) bar:(NSString*)barString; 
-(void) baz:(NSString*)bazString; 
0

Bu yan cevap türüdür, ancak aşağıdakileri yapabilirsiniz gerçeği beni yönteme arasında daha iyi ayrılmasını anlamama yardımcı imzalar ve seçiciler. ve UIPopoverController en dismissPopoverAnimated:

Bu kod

NSMethodSignature *sig = nil; 
sig = [[self class] instanceMethodSignatureForSelector:@selector(viewDidAppear:)]; 
NSInvocation *myInvocation = nil; 
myInvocation = [NSInvocation invocationWithMethodSignature:sig]; 

[myInvocation setTarget:_somePopoverController]; 
[myInvocation setSelector:@selector(dismissPopoverAnimated:)]; 
BOOL animate = YES; 
[myInvocation setArgument:&animate atIndex:2]; 
[myInvocation invoke]; 

UIViewController'ın viewDidAppear yana

bir View Controller içinde hem piyasadaki BOOL argüman alır ve boşluk dönmek, bir seçici kullanarak yöntem imza oluşturmak, ama çağırmayı gönderebilir başka bir.