Ich bin neu in Objective-C und ich versuche Speicherverwaltung zu verstehen, um es richtig zu machen.Wann wird ein automatisch freigegebenes Objekt tatsächlich freigegeben?
Nach den hervorragenden
Memory Management Programming Guide for Cocoa von Apfel meiner einzige Sorge zu lesen ist, wenn tatsächlich ein Autoreleased Objekt in einer iPhone/iPod Applikation freigegeben wird. Mein Verständnis ist am Ende einer Laufschleife. Aber was definiert eine Laufschleife in der Anwendung?
Also habe ich mich gefragt, ob das folgende Stück Code richtig ist. Angenommen, ein Objekt
@implementation Test
- (NSString *) functionA {
NSString *stringA;
stringA = [[[NSString alloc] initWithString:@"Hello"] autorelease]
return stringA;
}
- (NSString *) functionB {
NSString *stringB;
stringB = [self functionA];
return stringB;
}
- (NSString *) functionC {
NSString *stringC;
stringC = [self functionB];
return stringC;
}
- (void)viewDidLoad {
[super viewDidLoad];
NSString* p = [self functionC];
NSLog(@"string is %@",p);
}
@end
Ist dieser Code gültig?
Aus dem Text Apfel ich, dass der NSString von Funktioneine im Rahmen FunktionD gültig ist zurückgekehrt zu verstehen. Ich bin mir nicht sicher, ob es in functionC und in ViewDidLoad gültig ist.
Danke!
Verstehe ich richtig, dass, wenn ich keine Autorelease-Pools erstellt habe, alle automatisch freigegebenen Variablen im Speicher verbleiben, bis die Anwendung nicht geschlossen wird? – Burjua
Art von, erstellen die System-Frameworks einige Autorelease-Pools für Sie an der Spitze des Stapels des Haupt-Thread in Methoden wie UIApplicationMain(). Wenn Sie jedoch einen eigenen Thread gestartet haben und keinen Pool erstellt haben, dann würden diese Objekte tatsächlich undicht sein. Die Autorelease-Methode meldet sich in diesem Fall an der Konsole an. –
Ok, danke, aber das ist seltsam, es ist normal, Konstruktoren zu verwenden, die automatisch freigegebene Objekte zurückgeben und sie nicht freigeben, aber es ist eigentlich dasselbe, Speicherleck zu haben (Speicher wird zugewiesen, bis Anwendung geschlossen wird). Oder ich verstehe etwas nicht? – Burjua