IOS - performSelector: withObject: afterDelay: NOT WORKING

8

Referenz:

Ссылка

Wie der oben genannte Link, aber es scheint, dass es den Grund nicht erklärt.

In meinem Code wird Folgendes funktionieren:

%Vor%

aber, wenn ich so etwas kommentiere (und ich bin mir wirklich sicher, dass ich es im Hauptthread ausführe !!), funktioniert der Code nicht:

%Vor%

Kann mir jemand sagen warum? AND 'self', wird freigegeben / freigegeben, ich behalte es, bis die Anwendung beendet ist.

"Not Working" bedeutet, dass (kein Absturz) nicht in die "HelloWorld" -Methode springt:

%Vor%

Ich denke, die Run-Schleife verursacht dieses Problem. Wie dieser Link sagte, aber ich brauche mehr Details oder explizite erklären.

    
isaacselement 06.06.2013, 07:38
quelle

2 Antworten

21

Als ich so etwas passierte, rief ich performSelector von einem GCD-Versand an. Also wurde der Timer im GCD-Worker-Thread gesetzt, der wegging, bevor der Timer ausgelöst wurde. Wenn GCD den Arbeitsthread entfernt hat, ging der Zeitgeber verloren, so dass der Selektor nie aufgerufen wurde.

    
Walt Sellers 06.06.2013, 08:17
quelle
1

BEARBEITEN Wie in den Kommentaren erwähnt, performSelector: withObject: afterDelay: behält auch Ihr Objekt, also ignorieren Sie meine Antwort. ENDE BEARBEITEN

Ich nehme an, Sie verwenden ARC. Ihr Block behält Ihr Objekt.

%Vor%

Aus diesem Grund wird der Selektor ausgelöst. Wenn Sie den Block kommentieren, behält niemand einen Verweis auf Ihr Objekt, so dass es automatisch freigegeben wird.

%Vor%

Zu der Zeit, die aTimeUnit vergangen ist, wurde self wahrscheinlich freigegeben, so dass der Selektor-Aufruf verloren geht. Das ist dein Problem.

Sie sollten es vermeiden, das Selbst innerhalb eines Blocks zu erfassen, da Sie, wenn Sie den Block in einem Ivar speichern, möglicherweise einen Retain-Zyklus haben, der dazu führt, dass das Objekt nicht freigegeben wird. Hier reden sie darüber: Wie vermeide ich es, Selbst in Blöcken zu erfassen bei der Implementierung einer API?

    
The dude 06.06.2013 08:05
quelle

Tags und Links