9

To jest pytanie już odpowiedzieć w ramach SO ale Nie mogę znaleźć go w dokumentacji Apple nigdzie. Czy możesz wskazać mi właściwy kierunek?performSelector: withObject: i zachowuje zachowanie

obrębie następujących tematów

Do I have to retain an object before passing it to -performSelector:withObject:afterDelay:?

the effect on retain count of performSelector:withObject:afterDelay:inModes

Is object that calls performSelector:withObject:afterDelay get retained by the NSRunLoop?

domyślne zachowanie wydaje się być następujące: zachowuje odbiornik i argumentu (ów).

Używam następujący kod

[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData]; 

gdzie userData jest autoreleased oject.

Rejestrowanie licznika zatrzymania (Wiem, że może to nie być prawidłowe, aby to zrobić) dane przekazane w przyrostach licznika zatrzymania. Gdy metoda jest wywoływana przez delegata, liczba zatrzymań nie jest równa jednej.

Moje pytanie brzmi: czy muszę wykonać pewne zarządzanie pamięcią, aby uniknąć wycieków, czy też muszę zaufać produktom Apple? Mówię tu jako agnostyk, ponieważ nie mogę znaleźć odpowiednich dokumentów.

Z góry dziękuję.

+0

Uważam, że liczba zatrzymanych nie jest już poprawna w ARC – Dustin

+0

@ Co nie używam ARC w tym projekcie. Dzięki. –

+0

Dla projektu z włączonym ARC możesz zajrzeć do - http://stackoverflow.com/questions/7017281/performselector-may-cause-a-leak-because-its-selector-is-unknown – rishi

Odpowiedz

11

Patrzysz na niewłaściwą funkcję w dokumentacji.

Zachowaj

performSelector:withObject:afterDelay: i podobne funkcje (zafterDelay) zachowuje odbiornik i argumentów, ponieważ wykonać później

Nie Utrzymał

performSelector:withObject: i podobne funkcje (bezafterDelay) do niczego nie zatrzymują, ponieważ bezpośrednio wywołują funkcję.

[[self delegate] performSelector:@selector(tryToSendStoreData:) withObject:userData]; 

robi dokładnie to samo jak

[[self delegate] tryToSendStoreData:userData]; 
+0

+1 za wsparcie. Ale nie mogę znaleźć do tego żadnego dokumentu. Ponadto, dlaczego wartość zatrzymania zwiększa się po wykonaniu tego połączenia? Dziękuję Ci. –

+0

@Flex_Addicted: często funkcje zachowują, a następnie autorelease swoje argumenty, dla dodatkowego bezpieczeństwa. Dlatego też, patrząc na licznik zatrzymań, jest bezużyteczny. – newacct

+0

Dzięki. Następnie, jeśli masz jakiś dokument na ten temat, połącz go. Twoje zdrowie. –

10

Podczas @newacct dał prawidłową odpowiedź, ale nie było na pytanie, które @Flex_Addicted poprosił, czyli cytaty z dokumentacji firmy Apple, że obserwowane zachowanie jest rzeczywiście gwarantowane. Poniżej znajduje się (częściowe) cytat, ale będziemy musieli przejść przez kilka obręcze dojechać -

Dokumentacja performSelector:withObject:afterDelay: stwierdza, że ​​

Ta metoda ustawia timer do wykonania aSelector wiadomość na pętli uruchamiania bieżącego wątku.

więc następnym musimy udać się w dokumentacji NSRunLoop a tam okazuje się, że tylko jedna metoda istnieje, który pozwala na zdolność do enqueue rzeczy na pętli run -
performSelector:target:argument:order:modes:, których dokumentacja wskazuje, że

Ta metoda ustawia licznik czasu do wykonania komunikatu aSelector w pętli uruchamiania bieżącego wątku na początku kolejnej iteracji pętli. Licznik jest skonfigurowany tak, aby działał w trybach określonych przez parametr mode ... Odbiornik zachowuje obiekt docelowy i anArgument, dopóki timer selektora nie uruchomi się, a następnie zwolni je w ramach czyszczenia.

Oczywiście, nic nie gwarantuje, że [NSObject performSelector:withObject:afterDelay:] zawsze używa [NSRunLoop performSelector:target:argument:order:modes:] (choć ta odpowiedź nie byłaby kompletna, gdyby ktoś mógł wymyślić dokumentacji do tego), ale przynajmniej jest to krok w kierunku tajemnicy odpowiadając na zagadki z Pisma święte nas zagadują.

Powiązane problemy