Objective-C @autoreleasepool和" alloc"在名字里

时间:2013-10-18 09:31:56

标签: objective-c

我的朋友和我试图找出@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];
            }
        }
    }

且具有不同名称的相同方法显示不同的结果(regularDictallocDict):

测试1(autoreleaseDict enter image description here

测试2(regularDict enter image description here

测试3(allocDict enter image description here

Test4(allocAutoreleaseDict enter image description here

当方法返回对象时,

AFAIK ARC,此对象为autorelease。这对于Test1,Test2和Test4来说都是如此,但在我看来,Test3(allocDict)对象不是autorelease,因为内存使用率很低。而且我认为这是因为此方法名称中的alloc字。

也许有人知道为什么应用程序会这样?

1 个答案:

答案 0 :(得分:2)

iOS的basic memory management rules之一说:“您拥有自己创建的任何对象。 使用名称以“alloc”,“new”,“copy”或“mutableCopy”开头的方法创建对象。 这意味着,如果对象使用以“alloc”开头的方法,则此对象不会自动释放,而是由调用该方法的对象保留。然而,编译器会适当地插入释放消息,以便在不再需要时释放对象 因此,根据使用的名称,您的方法确实存在根本区别。