9

Dies ist eine Frage, die bereits in SO beantwortet wird, aber Ich kann es nirgendwo in der Apple-Dokumentation finden. Könnten Sie mir in die richtige Richtung zeigen?performSelector: withObject: und sein Retain-Verhalten

In den folgenden Themen

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?

das Standardverhalten scheint, die folgenden zu sein: behält er den Hörer ab und das Argument (e).

Ich verwende den folgenden Code

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

wo userData ein Autoreleased oject ist.

Protokollierung der Retain-Anzahl (Ich weiß, dass es nicht gültig sein könnte, es zu tun) die Daten übergeben inkrementiert seine Retain-Anzahl. Wenn die Methode für den Delegaten aufgerufen wird, ist die Retain-Anzahl ungleich eins.

Also meine Frage ist: muss ich etwas Speicherverwaltung durchführen, um Lecks zu vermeiden, oder muss ich auf Apple-Sachen vertrauen? Hier spreche ich als Agnostiker, da ich nicht die richtigen Dokumente finden kann.

Vielen Dank im Voraus.

+0

Ich glaube, dass beibehalten zählen nicht mehr genau unter ARC ist – Dustin

+0

@Cake Ich verwende ARC in diesem Projekt nicht. Vielen Dank. –

+0

Für ARC-fähigen Projekt können Sie schauen - http://StackOverflow.com/questions/7017281/performselector-may-cause-a-leak-because-its-selectors-is-unknown – rishi

Antwort

11

Sie suchen die falsche Funktion in der Dokumentation.

beibehalten

performSelector:withObject:afterDelay: und ähnliche Funktionen (mitafterDelay) den Empfänger und Argumente behalten, weil die später ausführen

Bewahren Sie keine

performSelector:withObject: und ähnliche Funktionen (ohneafterDelay) tun nichts behalten, da sie die Funktion nur direkt aufrufen.

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

tut genau dasselbe wie

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

+1 für Ihre Unterstützung. Aber ich kann kein Dokument dafür finden. Warum erhöht die Retain-Zählung den Wert nach Ausführung dieses Aufrufs? Vielen Dank. –

+0

@Flex_Addicted: Es ist üblich, dass Funktionen ihre Argumente für zusätzliche Sicherheit behalten und dann automatisch freigeben. Deshalb ist es unbrauchbar, sich die Anzahl der Retouren anzusehen. – newacct

+0

Danke. Wenn Sie ein Dokument darauf haben, verknüpfen Sie es bitte. Prost. –

10

Während @newacct die richtige Antwort gab, aber es war nicht die Frage, dass @Flex_Addicted gefragt hatte, also Zitate aus Apples Dokumentation, die das beobachtete Verhalten ist in der Tat garantiert. Nachfolgend finden Sie ein (teilweise) Zitat, aber wir werden durch ein paar Reifen gehen müssen, um dorthin zu gelangen -

Die Dokumentation für performSelector:withObject:afterDelay: besagt, dass

Diese Methode einen Timer richtet den aSelector auszuführen Nachricht in der Laufschleife des aktuellen Threads.

so weiter fahren wir für NSRunLoop in der Dokumentation über und dort finden wir, dass nur eine Methode besteht, dass die Fähigkeit erlaubt es Sachen auf der Flucht Schleife zu einzureihen -
performSelector:target:argument:order:modes:, deren Dokumentation besagt, dass

Diese Methode richtet einen Zeitgeber ein, um die aSelector-Nachricht in der Ausführungsschleife des aktuellen Threads zu Beginn der nächsten Schleifeniteration auszuführen. Der Timer ist so konfiguriert, dass er in den Modi läuft, die durch den Modes-Parameter festgelegt wurden. Der Empfänger behält die Objekte target und anArgument bei, bis der Timer für den Selektor ausgelöst wird, und gibt sie dann als Teil seiner Bereinigung frei.

Natürlich garantiert nichts, dass [NSObject performSelector:withObject:afterDelay:] verwendet immer [NSRunLoop performSelector:target:argument:order:modes:] (obwohl diese Antwort vollständig sein würde, wenn jemand mit der Dokumentation für das kommen kann), aber zumindest ist dies ein Schritt in Richtung auf das Geheimnis um die Rätsel der Beantwortung des Heilige Schriften rätseln uns mit.

Verwandte Themen