【问题标题】:Objective-C @autoreleasepool and method with "alloc" in the nameObjective-C @autoreleasepool 和名称中带有“alloc”的方法
【发布时间】:2013-10-18 09:31:56
【问题描述】:

我和我的朋友试图弄清楚@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)

Test3 (allocDict)

Test4 (allocAutoreleaseDict)

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

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

【问题讨论】:

    标签: objective-c


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我忘了这篇文章。创建名称中带有alloc 的方法是个好主意吗?编辑:我的意思是,使用名称中带有alloc 的方法来保留从该方法返回的对象是一种好习惯吗?
    • 我想在大多数情况下它没有区别,因为 ARC 自动关心保留、释放和自动释放。如果您分配许多对象以致有内存不足的危险,或者如果您将许多对象放入很少耗尽的自动释放池中(但在这种情况下,您可以定义自己的自动释放池),这可能会有所不同更频繁)。
    猜你喜欢
    • 2012-07-20
    • 1970-01-01
    • 2014-07-23
    • 2013-05-23
    • 2010-11-08
    • 2013-05-21
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    相关资源
    最近更新 更多