0

我正在使用 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.所以我的问题是如何在someMethod中完全释放string2?

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

4 回答 4

2

如果您使用 ARC,则不能释放任何对象,例如。当您使用 ARC 时,它由编译器自己处理。

所以,即使是字符串也会以同样的方式被释放。

于 2013-05-01T09:30:46.607 回答
2

首先,

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

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

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

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

此问题包含有关将自动释放池与 ARC 一起使用的更多详细信息。而且 Apple 的官方文档可能是我见过的最好的,所以请随意看看他们的 Advanced memory management programming guide。它不会太长,它详细解释了所有内容:)

于 2013-05-01T10:18:36.467 回答
0

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

于 2013-05-01T09:23:47.430 回答
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处于autoreleased模式,您不必释放它。

当您使用ARC(Automatic Reference Counting)时。你永远不会释放对象。编译器会处理它。

于 2013-05-01T09:22:09.720 回答