iphone - @autoreleasepool 做什么?

标签 iphone ios objective-c sdk

我正在使用 ARC,我知道自动释放池会向其中的所有元素发送释放。考虑以下示例。

-(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 一些方法?

<强>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;

}

最佳答案

首先,

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

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

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

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

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

关于iphone - @autoreleasepool 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16315621/

相关文章:

iphone - 我怎样才能从我的按钮而不是只有一个收到连续触地事件的通知?

css - 悬停按钮背景颜色保留在移动设备上

iphone - UITextField 自定义背景 View 和移动文本

iphone - 奇怪的情况给出错误 : "The application bundle does not contain a valid identifier."

ios - 如果我使用两个文本字段,如何设置键盘

ios - 应用程序运行时不断增加内存使用量(Swift)

iphone - 如何在本地保存对象?

objective-c - 在制作保存文章的RSS阅读器时,如何防止重复?

ios - 大小与字体 : ConstrainedToSize: lineBreakMode: method is deprecated in iOS 7

iphone - CFMutableAttributedString 在设备上运行时崩溃 (EXC_BAD_ACCESS)