Utwórz nowy projekt ARC i wprowadź ten kod w didFinishLaunchingWithOptions.NSNumber możliwy wyciek pamięci
for (int i=0; i < 1000000; i++) {
NSNumber* num = [NSNumber numberWithInt:i];
NSLog(@"%@", num);
}
NSLog(@"over");
Pamięć aplikacji zwiększy się. Również na końcu pętli for pamięć nie zmniejszy się.
Jednakże, jeśli w tym samym zastąpić pętli:
NSNumber* num = [NSNumber numberWithInt:i];
przez
NSNumber* num = [[NSNumber alloc] initWithInt:i];
Następnie pamięć pozostanie stabilny.
Czy to oczekiwane zachowanie?
EDIT:
Ok, więc postawmy didFinishLaunchingWithOptions na stronie w tej chwili. Nadal można umieścić viewDidLoad i usunąć zero, aby dotrzeć do końca pętli for. Pamięć aplikacji będzie rosnąć do ~ 11 MB. Po zakończeniu pętli for pamięć NIE zostanie zmniejszona. Pozostaje około ~ 11 MB.
- (void)viewDidLoad {
[super viewDidLoad];
for (int i=0; i < 100000; i++) {
NSNumber* num = [NSNumber numberWithInt:i];
NSLog(@"%@", num);
}
NSLog(@"over");
}
Jeśli się z:
- (void)viewDidLoad {
[super viewDidLoad];
@autoreleasepool {
for (int i=0; i < 100000; i++) {
NSNumber* num = [NSNumber numberWithInt:i];
NSLog(@"%@", num);
}
}
NSLog(@"over");
}
Niespodzianka! Niespodzianka! Będziesz mieć dokładnie takie samo zachowanie. Osiągniesz rozmiar około 11 MB, a pamięć NIE zostanie zmniejszona. Jednak wstawienie @autorelease w pętli zadziała ... Ale tutaj, nie próbuję działać, ale rozumiem, dlaczego pamięć nie jest wyczerpana na końcu pętli for.
Pytanie jest więc nadal otwarte.
Ciekawe .. Czekam na opinie specjalistów na ten jeden .. – rdurand
Co jeśli umieścić '@autoreleasepool {...}' 'wokół for' stwierdzeniem? – trojanfoe
Czy próbowałeś z innymi lekcjami Foundation? Co powiesz na init z innym typem (initWithBool: na przykład)? – rdurand