我和我的朋友试图弄清楚启用时何时@autoreleasepool
有用,ARC
我们注意到应用程序中有奇怪的行为。我们创建了多种方法:
- (NSDictionary *)autoreleaseDict {
return [NSDictionary dictionaryWithObjectsAndKeys:@"object", @"key", nil];
}
- (NSDictionary *)regularDict {
return [[NSDictionary alloc] initWithObjectsAndKeys:@"object",@"key", nil];
}
- (NSDictionary *)allocDict {
return [[NSDictionary alloc] initWithObjectsAndKeys:@"object", @"key", nil];
}
- (NSDictionary *)allocAutoreleaseDict {
return [NSDictionary dictionaryWithObjectsAndKeys:@"object", @"key", nil];
}
并在 2 个嵌套循环中运行它们:
for (int i = 0; i < 10; i++) {
@autoreleasepool {
for (int j = 0; j < 100000; j++) {
NSDictionary *dict = [self autoreleaseDict];
// NSDictionary *dict = [self regularDict];
// NSDictionary *dict = [self allocDict];
// NSDictionary *dict = [self allocAutoreleaseDict];
}
}
}
并且具有不同名称的相同方法显示不同的结果(regularDict
和allocDict
):
测试1 ( autoreleaseDict
)
测试2 ( regularDict
)
测试3 ( allocDict
)
测试4 ( allocAutoreleaseDict
)
AFAIKARC
当方法返回对象时,这个对象是autorelease
. Test1、Test2 和 Test4 都是如此,但在我看来,Test3 ( allocDict
) 中的对象不是autorelease
,因为内存使用率低。我相信那是因为alloc
这个方法的名字。
也许有人知道为什么应用程序会这样工作?