@autoreleasepool做什么?

时间:2013-05-01 09:19:20

标签: iphone ios objective-c sdk

我正在使用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。如何完全从viewDidLoad方法完全释放string1?

注意:我正在使用ARC

如果我在someMethod中使用@autoreleasepool,那么我认为它会破坏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;

}

4 个答案:

答案 0 :(得分:2)

如果您使用ARC,则无法释放任何对象。当您使用ARC时,它由编译器本身处理。

所以,即使是字符串也会以同样的方式发布。

答案 1 :(得分:2)

首先,

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

string2本身不是对象。它是指向对象的指针。所以在这里你创建一个对象,获取一个指向它的指针,然后立即用指向另一个字符串的指针替换它。如果你没有使用ARC,你会在这里泄漏内存。请查看@Anoop Vaidya的答案,了解更多相关细节。

至于您的问题:当您使用ARC时,编译器会自动跟踪对象并在不再使用时释放它们。所以你不必手动释放它。你可以指定一个指向nil的指针,但是一旦我记得它就没有必要了。

第二个示例中的代码无法编译,因为string1是在autorelease范围内声明的。实际上这个@autorelease在这里没有任何区别,因为你不在其中创建自动释放的对象。

This question包含有关在ARC中使用自动释放池的更多详细信息。 Apple的官方文档可能是我见过的最好的文档,所以请随时查看their Advanced memory management programming guide。它不会太长,它会详细解释所有内容:)

答案 2 :(得分:0)

NSString *string2=[[NSString alloc] init];        // string2 retain count is 1
string2=@"sample text inside string 2"; 

做坏事。

相反,这样做

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

甚至

NSString *string2=@"sample text inside string 2";

string1处于autorelease d模式,您无需释放它。

正在使用ARC(Automatic Reference Counting)。你永远不会释放对象。编译器负责处理它。

答案 3 :(得分:0)

您无需释放它,它将由ARC自动完成。 如果您在使用ARC时尝试释放任何对象,则会出错。