2009-08-14 7 views
0

Ich weiß, es ist in Ordnung, eine Methode aufzurufen, als ob es leer war, obwohl es einen Rückgabewert (wie printf) hat, aber was ist damit?Objective c - Call-Objekt zurückkehrende Methode ohne Rückgabewert

Kann ich das einfach schweben lassen, ohne das Objekt zu benutzen, das es zurückgibt? Das ist so, als würde man [NSObject alloc] aufrufen, ohne das einem Zeiger oder irgendetwas zuzuweisen. Ist das ein Speicherleck? Der Grund ist, dass ich es nicht einer Variablen (dem Timer) zuweisen möchte, denn wenn ich es loslasse (oder automatisch lösche), wird es gelöscht, bevor es ausgelöst wird. Und ich möchte keinen Ivar benutzen. Also was soll ich tun?

EDIT: Ich fand heraus über [self performSelector: @selector (myMethod) withObject: nil afterDelay: 0.3]; Das ist viel besser als das Verwenden des Timers.

Antwort

2

NSTimer, der von diesem Aufruf erstellt wird, gehört dem aktuellen NSRunLoop-Objekt, daher wird er nicht automatisch von einem Autorelease-Pool-Drain freigegeben. Und es ist falsch, es manuell zu veröffentlichen. NSTimer sollte es durch das Senden entfernt werden Nachricht ungültig:

die Entfernung eines Timers von einem NSRunLoop Objekt anzufordern, senden Sie den Timer die Ungültigkeitsmitteilung aus dem gleichen Faden, an dem der Timer installiert wurde. Diese Nachricht deaktiviert den Timer sofort, sodass er das NSRunLoop-Objekt nicht mehr beeinflusst. Die Ausführungsschleife entfernt und gibt den Zeitgeber entweder unmittelbar vor der Rückgabe der Ungültigmachungsmethode oder zu einem späteren Zeitpunkt frei.

Also im Grunde sollten Sie eine Variable für sie haben und verwenden ungültig statt Release

+0

gibt es eine Möglichkeit, nur machen es ungültig, wenn er ausgelöst wird? Es wiederholt sich nicht. Es funktioniert jetzt perfekt, außer wenn es ein Speicherleck gibt. Leaks sagt nicht, dass es ein Leck gibt, und das Timer-Objekt wird niemals einem Zeiger zugewiesen oder freigegeben oder ungültig gemacht. – mk12

+0

Ich habe es herausgefunden, ich wusste nicht, dass der Timer sich selbst als Argument ausgibt. Du sagst also, ich sollte den Timer ungültig machen und nicht freigeben? – mk12

+0

Sie müssen recht haben, weil ich nach dem Entwerten versucht habe zu releasen und es abgestürzt ist ... Danke! – mk12