2

我和我的朋友试图弄清楚启用时何时@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) 在此处输入图像描述

测试2 ( regularDict) 在此处输入图像描述

测试3 ( allocDict) 在此处输入图像描述

测试4 ( allocAutoreleaseDict) 在此处输入图像描述

AFAIKARC当方法返回对象时,这个对象是autorelease. Test1、Test2 和 Test4 都是如此,但在我看来,Test3 ( allocDict) 中的对象不是autorelease,因为内存使用率低。我相信那是因为alloc这个方法的名字。

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

4

1 回答 1

2

iOS的基本内存管理规则之一是:“您拥有您创建的任何对象。您使用名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法创建对象”。
这意味着,如果一个对象使用以“alloc”开头的方法,则该对象不会自动释放,而是由调用该方法的对象保留。然而,编译器会适当地插入释放消息,以便在不再需要时释放对象。
因此,您的方法之间确实存在根本区别,具体取决于使用的名称。

于 2013-10-18T09:51:05.503 回答