2012-07-18 21 views
7

Jestem trochę zdezorientowany odnośnie performSelector. Już googlowałem. ale nie jest dla mnie jasne. każdy może wyjaśnić rolę performSelector.Jaki jest pożytek z performSelector w iOS

dzięki

[self btnClicked]; 

i

[self performSelector:@selector(btnClicked)]; 


-(void)btnClicked 
{ 

    NSLog(@"Method Called"; 
} 

oba Woking w porządku dla mnie. jaka jest różnica między tymi dwoma. [self btnClicked] i [self performSelector:@selector(btnClicked)];

Odpowiedz

10

Te dwa elementy są identyczne, gdy zostały użyte, jak wykazałeś, ale te ostatnie mają tę zaletę, że możesz dynamicznie określić, który selektor wywołaj w czasie wykonywania.

SEL selector = [self gimmeASelectorToCall]; 
[self performSelector: selector]; 

[Source]

+0

dzięki za szybką odpowiedź .. – QueueOverFlow

1

performSelector wywołuje metodę zadeklarowaną i zaimplementowaną w klasie. Jest używany, gdy musisz dołączyć akcję do zdarzenia.

4

selector obiektu pozwala wywołać metodę, że nie wiem w czasie kompilacji. Aby ją wywołać, musisz znać tylko nazwę metody jako ciąg.

Gdy nazwa wywoływanej metody jest znana podczas kompilacji, użycie selektorów przynosi efekt przeciwny do zamierzonego: kod staje się mniej czytelny bez widocznej przewagi. Podczas pisania biblioteki, która musi wywoływać metody w innym kodzie, który jest kompilowany oddzielnie od biblioteki, selektory zapewniają sposób rozłączenia dwóch fragmentów kodu.

Na przykład, jeśli piszesz klasę timera, która może oddzwonić po upływie określonego czasu, twój zegar nie zna nazwy funkcji, którą musi wywołać, więc nie może napisać mniej więcej tak:

// We do not know if the function is called intervalHasExpired or something else 
[target intervalHasExpired]; 

Ale jeśli przekażesz czasomierz selektorowi, timer będzie mógł oddzwonić.

[myTimer scheduleWithTarget:self andSelector:@selector(myCompletion)]; 
2

PerformSelector zasadzie pozwala zdecydować, co wiadomość przekazać podczas wykonywania (późne wiązanie), w przeciwieństwie do języków takich jak zwykły C. Jeśli znasz nazwę sposobu w sposób obiektywny klasy C, można użyć

NSSelectorFromString() 

Aby przekonwertować ciąg na selektor i niech klasa wywoła ten selektor za pomocą performSelector. W ten sposób możesz wybrać różne funkcje do wywoływania w czasie wykonywania. Możesz nawet wybrać, którą funkcję wywołać, używając pliku konfiguracyjnego.

8

Apple doc jest twoim przyjacielem.

NSObject Protocol Reference

To

Wysyła określoną wiadomość do odbiornika i zwraca wynik wiadomość.

W szczególności:

performSelector: sposób odpowiada wysyłając wiadomość aSelector bezpośrednio do odbiornika. Na przykład, wszystkie trzy z następujących komunikatów zrobić to samo:

id myClone = [anObject copy]; 
id myClone = [anObject performSelector:@selector(copy)]; 
id myClone = [anObject performSelector:sel_getUid("copy")]; 

Jednak performSelector: metoda pozwala na wysyłanie wiadomości, które nie są określone aż wykonywania. Zmienna selektor może być przekazany jako argument :

SEL myMethod = findTheAppropriateSelectorForTheCurrentSituation(); 
[anObject performSelector:myMethod]; 

aSelector argument powinien zidentyfikować metodę, która nie bierze argumenty. W przypadku metod, które zwracają cokolwiek innego niż obiekt, należy użyć wywołania NSV .

Nadzieję, że pomaga.

+0

dzięki. dla odpowiedzi. – QueueOverFlow

+0

@stackBlue Nie ma za co. Pogrubiłem główne części z dokumentu Apple. Awansuj jeśli chcesz :-) Pozdrawiam. –

Powiązane problemy