2008-11-18 21 views
53

Şu anki nesneden SEL olan bir kod örneğim var,Parametrelerle bir metod isminden bir seçici oluşturmak

SEL callback = @selector(mymethod:parameter2); 

Ve

 -(void)mymethod:(id)v1 parameter2;(NSString*)v2 { 
} 

gibi bir yönteme sahibim. Şimdi mymethod'i başka bir nesneye myDelegate olarak eklemem gerekiyor.

Denedim:

SEL callback = @selector(myDelegate, mymethod:parameter2); 

fakat derlenmiyor.

+2

@Jim Puls - bu aslında bir Objective-C sorunudur ... bu, iphone-sdk'a göre daha Kakao veya Kakao-touch'a özgü değildir. Ayrıca, bu günlerde objectivec üzerinden objektif-c etiketi ile gidiyoruz :) –

cevap

95

SEL, Objective-C'de bir seçiciyi temsil eden türdür. @selector() anahtar kelimesi, tanımladığınız bir SEL döndürür. Bu bir fonksiyon gösterici değildir ve herhangi bir nesneyi veya herhangi bir referansı geçemezsiniz. Seçicide bulunan her bir değişken için (yöntem), @selector çağrısında bunu temsil etmelisiniz. Örneğin:

-(void)methodWithNoParameters; 
SEL noParameterSelector = @selector(methodWithNoParameters); 

-(void)methodWithOneParameter:(id)parameter; 
SEL oneParameterSelector = @selector(methodWithOneParameter:); // notice the colon here 

-(void)methodWIthTwoParameters:(id)parameterOne and:(id)parameterTwo; 
SEL twoParameterSelector = @selector(methodWithTwoParameters:and:); // notice the parameter names are omitted 

Seçiciler genel yöntem temsilci geçirilir ve bir geri sırasında belirli bir nesne üzerinde adı gereken yöntem belirlemek için olan geri edilir. Eğer bir zamanlayıcı oluştururken Örneğin, geri çağırma yöntemi özellikle gibi tanımlanmıştır:

-(void)someMethod:(NSTimer*)timer; 

Yani gerçekten callback'inde sorumlu olacak nesne üzerinde hangi yöntemin belirtmek için @selector kullanırsınız zamanlayıcı planladığımda:

@implementation MyObject 

-(void)myTimerCallback:(NSTimer*)timer 
{ 
    // do some computations 
    if(timerShouldEnd) { 
     [timer invalidate]; 
    } 
} 

@end 

// ... 

int main(int argc, const char **argv) 
{ 
    // do setup stuff 
    MyObject* obj = [[MyObject alloc] init]; 
    SEL mySelector = @selector(myTimerCallback:); 
    [NSTimer scheduledTimerWithTimeInterval:30.0 target:obj selector:mySelector userInfo:nil repeats:YES]; 
    // do some tear-down 
    return 0; 
} 

Bu durumda nesne her 30 saniyede myTimerCallback messaged edilmesi obj olduğunu belirterek vardır.

+1

coco - NSTimer'in aldığı seçiciyi çağırmak için kullandığı kodu sağlayabilir misiniz? – mobibob

16

Parametreyi bir @selector() içinden geçiremezsiniz.

Geri arama gerçekleştirmeye çalışıyorsunuz gibi görünüyor. withSelector: senin nesnenin setCallbackObject içinde Sonra

[object setCallbackObject:self withSelector:@selector(myMethod:)]; 

: yöntemi: Bunu yapmanın en iyi yolu, böyle bir şey olacağını size geri arama yöntemini çağırabilirsiniz.

-(void)setCallbackObject:(id)anObject withSelector:(SEL)selector { 
    [anObject performSelector:selector]; 
} 
+0

Bu tamamen iPhone da değil. Apple'ın http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/chapter_1_section_1.html –

+4

belgesini bulabileceğiniz "Obective-C 2.0 Programlama Dili" belgesini okumak isteyebilirsiniz. aramaya gerek duyulur: [anObject performSelector: selector]; –

5

Seçiciler hakkında daha önce söylediklerinizin ötesinde, NSInvocation sınıfına bakmak isteyebilirsiniz.

Bir NSInvocation bir eylem bir nesne dönüştü olduğunu, yani bir Objective-C mesajı statik hale olduğunu. NSInvocation nesneleri, başta NSTimer nesneleri ve dağıtılmış nesne sistemi olmak üzere, nesneler ve uygulamalar arasındaki iletileri saklamak ve iletmek için kullanılır.

Bir NSInvocation nesnesi bir Objective-C iletisinin tüm öğelerini içerir: bir hedef, bir seçici, bağımsız değişkenler ve dönüş değeri. Bu öğelerin her biri doğrudan ayarlanabilir ve NSInvocation nesnesi gönderildiğinde dönüş değeri otomatik olarak ayarlanır.

belli durumlarda yararlıdır iken, bu kodlama normal bir günde NSInvocation kullanmayın unutmayın.Birbirinizle konuşmak için iki nesne bulmaya çalışıyorsanız, resmi olmayan veya resmi bir delege protokolünü tanımlamayı veya daha önce bahsedildiği gibi bir seçici ve hedef nesneyi geçirmeyi düşünün.

İlgili konular