我的朋友和我试图找出@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
)
Test4(allocAutoreleaseDict
)
AFAIK ARC
,此对象为autorelease
。这对于Test1,Test2和Test4来说都是如此,但在我看来,Test3(allocDict
)对象不是autorelease
,因为内存使用率很低。而且我认为这是因为此方法名称中的alloc
字。
也许有人知道为什么应用程序会这样?
答案 0 :(得分:2)
iOS的basic memory management rules之一说:“您拥有自己创建的任何对象。 使用名称以“alloc”,“new”,“copy”或“mutableCopy”开头的方法创建对象。 这意味着,如果对象使用以“alloc”开头的方法,则此对象不会自动释放,而是由调用该方法的对象保留。然而,编译器会适当地插入释放消息,以便在不再需要时释放对象 因此,根据使用的名称,您的方法确实存在根本区别。