gpt4 book ai didi

iphone - @autoreleasepool 做什么?

转载 作者:行者123 更新时间:2023-11-28 19:10:17 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com