2009-08-16 14 views
9

Es gibt viele Fälle, in denen man eine Instanz zuweist und sie sofort wieder freigibt, nachdem sie einer anderen Instanz zugewiesen wurde, die sie intern speichert.Ist es besser, gleich danach zu autorelease oder release?

Zum Beispiel

 
UIView *view = [[UIView alloc] initWithFrame...]; 
[self addSubView:view]; 
[view release]; 

Ich habe gehört, haben die Menschen darauf hindeutet, dass wir mit Autorelease gehen, anstatt Release direkt nach.

So die oben wird:

 
UIView *view = [[[UIView alloc] initWithFrame...] autorelease]; 
[self addSubView:view]; 

Was hier die beste Praxis ist? Vor-und Nachteile?

Antwort

14

In den meisten Fällen ist es nicht so oder so wichtig. Da einfach bedeutet, dass das Objekt am Ende der aktuellen Iteration der Laufschleife freigegeben wird, wird das Objekt in beide Richtungen freigegeben.

Der größte Vorteil der Verwendung von ist, dass Sie sich im Zusammenhang mit Ihrer Methode keine Gedanken über die Lebensdauer des Objekts machen müssen. Wenn Sie sich später entscheiden, dass Sie nach der letzten Verwendung mehrere Zeilen mit einem Objekt bearbeiten möchten, müssen Sie sich keine Gedanken darüber machen, Ihren Anruf auf -release zu verschieben.

Die Hauptinstanz, wenn -release verwendet, wird einen spürbaren Unterschied machen -autorelease vs. verwenden ist, wenn Sie viel temporärer Objekte in Ihrer Methode zu schaffen. Betrachten wir zum Beispiel die folgende Methode:

- (void)someMethod { 
    NSUInteger i = 0; 
    while (i < 100000) { 
     id tempObject = [[[SomeClass alloc] init] autorelease]; 

     // Do something with tempObject 

     i++; 
    } 
} 

Bis dieses Verfahren endet, haben Sie 100.000 Objekte in der Autofreigabepool sitzen warten freigegeben zu werden. Je nach Klasse von tempObject kann dies ein großes Problem auf dem Desktop sein oder auch nicht, aber es ist sicherlich auf dem speicherbeschränkten iPhone. Daher sollten Sie wirklich -release über -autorelease verwenden, wenn Sie viele temporäre Objekte zuweisen. Aber für viele/die meisten Anwendungen werden Sie keine größeren Unterschiede zwischen den beiden sehen.

+3

+1. Autorelease bekommt eine Menge Flak-Over-Performance (Flak habe ich selten mit Zahlen in normalen, nicht-großen Loop-Code gesichert gesehen), aber Autorelease spart auch viele Lecks, wenn Code überarbeitet wird. Ich benutze Release häufiger in Low-Level-Routinen, da ich nicht weiß, ob sie in einer großen Schleife auf einer höheren Ebene aufgerufen werden. Wenn Sie jedoch Release verwenden, müssen Sie die Variable unmittelbar danach auf Null setzen, wenn die Variable weiterhin im Gültigkeitsbereich ist. Niemals ein Objekt loslassen, aber immer noch einen Zeiger darauf haben. –

5

Ich stimme zu Matt Ball. Lassen Sie mich das nur noch hinzufügen, wenn Sie sich mit diesem Muster häufig zu finden, ist es sehr nützlich sein kann, eine schnelle Kategorie zu schreiben:

UIView * view = [someView addNewSubviewOfType:[UIView class] 
             inFrame:someFrame]; 

Und es auch Werke:

@interface UIView (MyCategories) 
- (UIView *)addNewSubviewOfType:(Class)viewType inFrame:(NSRect)frame; 
@end 

@implementation UIView (MyCategories) 
- (UIView *)addNewSubviewOfType:(Class)viewType inFrame:(NSRect)frame 
{ 
    UIView * newView = [[viewType alloc] initWithFrame:frame]; 
    [self addSubView:newView]; 
    return [newView autorelease]; 
} 
@end 

, die verwendet werden können, wie folgt mit anderen Arten, solange sie von UIView ableiten:

UIButton * button = [mainView addNewSubviewOfType:[UIButton class] 
              inFrame:buttonFrame]; 
4

ich in der Regel für -release gehen, anstatt -autorelease, wann immer möglich. Dies beruht auf jahrelanger Erfahrung mit dem Debuggen und Verbessern des Objective-C-Codes anderer Leute. Code, der Autorelease überall verwendet, macht es schwieriger zu debuggen, wenn ein Objekt zu viel freigegeben wird, da die zusätzliche Veröffentlichung weit entfernt von dem falschen Code stattfindet.

Es ist auch der Fall, dass viele Leute Autorelease verwenden, wenn sie einfach nicht verstehen, wie Kakao-Speicherverwaltung funktioniert. Erlernen Sie die Regeln, lernen Sie die API und Sie werden fast nie ein Objekt automatisch freigeben müssen.

Ein letzter kleiner Punkt ist, dass, wenn Sie nicht das AutoRelease-Verhalten benötigen, dann die Verwendung von AutoRelease nur unnötig zusätzliche Arbeit für Ihr Programm zu tun.

Verwandte Themen