创建一个ARC新项目,并将此代码注入didFinishLaunchingWithOptions函数中。
应用程序的内存将增加。 此外,在for循环结束时,内存不会减少。
然而,如果在同一个for循环中替换:
for (int i=0; i < 1000000; i++) {
NSNumber* num = [NSNumber numberWithInt:i];
NSLog(@"%@", num);
}
NSLog(@"over");
应用程序的内存将增加。 此外,在for循环结束时,内存不会减少。
然而,如果在同一个for循环中替换:
NSNumber* num = [NSNumber numberWithInt:i];
by
NSNumber* num = [[NSNumber alloc] initWithInt:i];
那么内存将保持稳定。
这是预期行为吗?
编辑:
好的,那么暂时将didFinishLaunchingWithOptions放在一边。 您仍然可以将其放在viewDidLoad中,并删除一个零以更快地到达for循环的结尾 应用程序的内存将增长到约11 MB。当for循环结束时,内存不会减少。它仍然保持在约11 MB。
- (void)viewDidLoad {
[super viewDidLoad];
for (int i=0; i < 100000; i++) {
NSNumber* num = [NSNumber numberWithInt:i];
NSLog(@"%@", num);
}
NSLog(@"over");
}
如果您选择:
- (void)viewDidLoad {
[super viewDidLoad];
@autoreleasepool {
for (int i=0; i < 100000; i++) {
NSNumber* num = [NSNumber numberWithInt:i];
NSLog(@"%@", num);
}
}
NSLog(@"over");
}
惊喜!惊喜! 您将具有完全相同的行为。您将达到约11 MB,内存不会减少。然而,在循环内部放置@autorelease将起作用...但是,在这里,我不是要让事情工作,而是要理解为什么内存在for循环结束时没有被释放。
因此,问题仍然存在。
for
语句周围加上@autoreleasepool { ... }
,会发生什么? - trojanfoe