Nach allem, was ich über die Speicherverwaltung von Objective-C gelesen habe, klingt sie unglaublich einfach. Um es mit den Worten aller zu sagen: "Gib frei, was immer du zuweist, behalte oder kopiere". Aber ich denke, es gibt einige spezifischere Fälle, die nicht so eindeutig sind. Im Folgenden finden Sie einige Beispiele. Was ist die richtige Vorgehensweise für jede Situation:
SITUATION #1:
Foo *foo = [[foo alloc] init];
Foo *fooToo = [[[foo alloc] init] autorelease];
foo = fooToo;
Muss foo freigegeben werden, bevor es fooToo zugewiesen wird?
SITUATION #2 Ich scheine eine Menge Abstürze zu bekommen, wenn ich Dinge tue wie: (.h und .mashed zusammen für Bequemlichkeit)
Foo *foo;
@property (nonatomic, retain) Foo *foo;
@synthesize foo;
-(id)init{
self = [super init];
}
-(void)dealloc{
[super dealloc];
[foo release];
}
Mir wird ständig gesagt, "immer in dealloc freigeben, was Sie eine Retain-Eigenschaft für setzen". Aber dies wird abstürzen, wenn getan, wie ich gezeigt habe.
SITUATION #3 Eine ähnliche Situation, die ebenfalls zum Absturz führt: (.h und .mashed zusammen für Bequemlichkeit)
Foo *foo;
@property (nonatomic, retain) Foo *foo;
@synthesize foo;
-(id)init{
self = [super init];
self.foo = nil;
}
-(void)dealloc{
[super dealloc];
[foo release];
}
aus irgendeinem Grund, wenn mein Code macht es bis zu dealloc, foo ist nicht == nil.
SITUATION #4 Zum Schluss noch eine Frage: Welchen allgemeinen Denkprozess verwenden die Menschen bei der Entscheidung zwischen
self.foo = bar;
y
foo = bar;
wenn foo wie in den oben genannten Fällen deklariert wird? Ist self.foo
nur eine andere Art der Codierung:
foo = [bar retain]
;