我正在使用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;
}
答案 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时尝试释放任何对象,则会出错。