Erstellen Sie ein neues ARC-Projekt und injizieren Sie diesen Code in didFinishLaunchingWithOptions.NSNumber mögliche Speicherleck
for (int i=0; i < 1000000; i++) {
NSNumber* num = [NSNumber numberWithInt:i];
NSLog(@"%@", num);
}
NSLog(@"over");
Der Speicher der Anwendung wird zunehmen. Am Ende der for-Schleife wird auch der Speicher nicht verringert.
Wenn Sie jedoch in derselben for-Schleife ersetzen:
NSNumber* num = [NSNumber numberWithInt:i];
von
NSNumber* num = [[NSNumber alloc] initWithInt:i];
Dann Speicher stabil bleiben.
Ist dies ein erwartetes Verhalten?
EDIT:
Ok, also lassen Sie uns didFinishLaunchingWithOptions auf der Seite im Moment setzen. Sie können immer noch in ViewDidLoad und entfernen Sie eine Null, um das Ende der For-Schleife schneller Speicher der App wird bis zu ~ 11 MB wachsen. Wenn die for-Schleife endet, wird der Speicher NICHT abnehmen. Es bleibt bei ~ 11 MB.
- (void)viewDidLoad {
[super viewDidLoad];
for (int i=0; i < 100000; i++) {
NSNumber* num = [NSNumber numberWithInt:i];
NSLog(@"%@", num);
}
NSLog(@"over");
}
Wenn Sie gehen mit:
- (void)viewDidLoad {
[super viewDidLoad];
@autoreleasepool {
for (int i=0; i < 100000; i++) {
NSNumber* num = [NSNumber numberWithInt:i];
NSLog(@"%@", num);
}
}
NSLog(@"over");
}
Überraschung! Überraschung! Sie werden das gleiche Verhalten haben. Sie werden ~ 11 MB erreichen und der Speicher wird nicht sinken. Das @autorelease in die Schleife zu setzen, funktioniert jedoch ... Aber hier versuche ich nicht, die Dinge zum Laufen zu bringen, sondern zu verstehen, warum am Ende der for-Schleife der Speicher nicht leer ist.
Also, Frage ist noch offen.
Interessante .. Warten auf Spezialisten Meinungen zu diesem .. – rdurand
Was passiert, wenn Sie setzen '@autoreleasepool {...}' 'um die for' Aussage? – trojanfoe
Hast du es mit anderen Foundation-Klassen versucht? Was ist mit einer Init mit einem anderen Typ (initWithBool: zum Beispiel)? – rdurand