2016-12-15 4 views
0

Wenn Sie Objective-C schreiben, ist es wichtig, zu wissen, wie der Speicher verwaltet wird, selbst mit Hilfe von ARC.So geben Sie ein Objekt frei, das es initialisiert

ist hier ein Code-Schnipsel (non-ARC):

(1)

NSAttributedString *tmpAttrbutedString = [[NSAttributedString alloc] initWithString:@"foo" attributes:@{NSFontAttributeName:[NSFont fontWithName:@"Heiti SC" size:13.0f]}]; 
// how should I release tmpAttributedString here? 
tmpAttributedString = [[NSAttributedString alloc] initWithString:tmpAttributedString.string attributes:@{NSForegroundColorAttributeName:[NSColor redColor]}]; 
[tmpAttributedString release]; 

Hier ist, was ich tun, um momentan Speicherlecks zu vermeiden:

(2)

NSAttributedString *tmpAttrbutedString = [[NSAttributedString alloc] initWithString:@"foo" attributes:@{NSFontAttributeName:[NSFont fontWithName:@"Heiti SC" size:13.0f]}]; 
NSString *tmpString = tmpAttrbutedString.string; 
[tmpAttrbutedString release]; 

tmpAttributedString = [[NSAttributedString alloc] initWithString:tmpString attributes:@{NSForegroundColorAttributeName:[NSColor redColor]}]; 
[tmpAttributedString release]; 

Meine Fragen sind:

  1. Wie soll ich tmpAttributedString in (1), mit nur einem NSAttributedString Zeiger und ohne temporäre NSString wie in (2) freigeben? Ist es möglich? (Die zweite init hängt von der ersten init ab.)

  2. Was würde der Compiler in Szenario (1) tun? Ich meine, wie ARC Release/Autorelease dafür einfügen würde? Gibt es Speicherverlust in (1), wenn ARC aktiviert ist? (Natürlich expliziter Aufruf von release mit ARC entfernt.)

Thank you!

+0

alloc und init werden nur einmal bei einem objektiven C-Objekt aufgerufen? – dreamBegin

+0

@dreamBegin Nur um sicher zu gehen. Meinst du, ich sollte NSAtributedString Zeiger nicht wiederverwenden, und sollte einen neuen machen? –

+0

Sollten Sie nicht alle Attribute auf dem ersten initialisierten NSAtributedString setzen? Der zweite NSAttributedString muss nicht erstellt werden. –

Antwort

0

Die Regeln für ARC sind relativ einfach. Wenn Sie alloc, new oder copy aufrufen, dann versteht ARC, dass es release für dieses Objekt aufrufen muss, wenn es den Gültigkeitsbereich verlässt. Alle anderen Objekte werden als autoreleased angenommen. "Außerhalb des Gültigkeitsbereichs" bedeutet, dass eine Variable zurückgegeben oder neu zugewiesen wird. In dem Fall, in dem es eine Neuzuweisung einer Variablen sieht, wird es implizit einen release Aufruf eingeben, bevor es einem anderen zugewiesen wird. Wenn Sie eine Variable zurückgeben, wird ARC einen autorelease Aufruf an diese Variable senden, so dass sie außerhalb des Bereichs der Methode liegen kann; Alle anderen vorhandenen Variablen (die nicht autoreleased sind), die nicht zurückgegeben werden, aber immer noch existieren, werden eine implizite release an sie gesendet haben.

Apple's official transition guide als Referenz.

Verwandte Themen