[ios]@autoreleasepool 是做什么的?

发布时间: 2017/3/21 22:39:19
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我使用的电ARC,我知道 autoreleasepool 将释放发送到在它里面的所有元素。考虑下面的示例。

-(NSString*)someMethod{

    NSString *string1=@"sample text inside string 1"; // string1 add to main autorelease pool
    NSString *string2=[[NSString alloc] init];        // string2 retain count is 1

    string2=@"sample text inside string 2";           // just assigning

    return string1;

}

-(void)viewDidLoad{

    NSString *returnedString=[self someMethod];

}

1.所以我的问题是如何会完全释放 string2 在 someMethod?

2.如何完全完全释放 string1 从 viewDidLoad 方法?

注意︰ 我使用的电ARC

如果我使用 @autoreleasepool 在 someMethod 中的,那么它将摧毁 string1 和 string2。惯于它吗?

什么将在 someMethod 中使用 @autoreleasepool 的影响

-(NSString*)someMethod{

    @autoreleasepool{

    NSString *string1=@"sample text inside string 1"; // string1 add to main autorelease pool
    NSString *string2=[[NSString alloc] init];        // string2 retain count is 1

    string2=@"sample text inside string 2";           // just assigning

    }
    return string1;

}

解决方法 1:

首先

NSString *string2=[[NSString alloc] init];
string2=@"sample text inside string 2";  

string2 不是对象本身。它是指向对象的指针。这里你创建一个对象,获取指向它的指针,然后立即将其替换为另一个字符串的指针。如果你没有使用电ARC会泄漏内存在这里。看看 @Anoop Vaidya 回答有关它的详细信息。

至于你的问题︰ 当你使用电ARC时,编译器自动跟踪对象,并释放他们,当他们不再使用。所以你不需要手动释放它。您可以将指针分配至零,但只要我记得它是不必要。

你的第二个示例中的代码将无法编译,因为 string1 宣布 autorelease 范围内。其实这个 @autorelease 在这里都无所谓因为你不要创建 autoreleased 对象在它里面。

这个问题包含更多详细信息与ARC使用 autorelease 池。 苹果的官方文件可能是我看过的最好,所以请随时看看指导他们先进的内存管理编程。它并不是太长了,和:) 解释了万物的详细信息

官方微信
官方QQ群
31647020