保留目标c

时间:2010-11-17 15:30:56

标签: iphone objective-c

我有一个关于retain和NSString的问题,如果我有一个返回NSString的方法,并且我将返回的NSString放在一个nsstring变量中,我必须保留或不保留?

NSString *myString = @"";
myString = [self methodWhoReturnString]; // I must do this?
myString = [[self methodWhoReturnString]retain]; // Or I must do this?

6 个答案:

答案 0 :(得分:5)

Apple Developer Documentation on Memory Management解释了保留/释放对象的方案。

简单地说,如果你想让琴弦粘在一起,你需要保留它直到你完成它。如果这只是当前函数的范围,你可以在不保留它的情况下离开,就像字符串已经自动释放一样(可能)在函数完成并清除当前的AutoReleasePool之前它不会被释放。

请记住,NSString *实际上可能指向NSMutableString *。如果您在没有意识到的情况下通过其他功能更改字符串对您很重要,请务必复制它:NSString * myCopyOfString = [mystring copy];

答案 1 :(得分:1)

如果字符串设置为autorelease,它很可能是,那么是的,你需要以某种方式保留它。我建议这样做:

myString = [[self methodWhoReturnString] copy];

这确保您保留字符串中的数据,而不仅仅是对可能仍在其他位置控制的字符串的引用。请务必稍后发布您的副本!

答案 2 :(得分:0)

其中包含allocnewcopy的任何方法都会自动保留并推断您拥有该对象的所有权。所有其他人不应该。如果你有更多的上下文会很有帮助。如果我们在一个包含的方法中短暂使用此字符串,那么您可能不需要保留。如果它将被使用一段时间,您可能希望使用@synthesize语法使其成为您所在类的属性。当您使用@property@synthesize时打电话给self.myProperty = something这样会自动保留。

答案 3 :(得分:0)

通常,methodWhoReturnString会返回一个自动释放的字符串,这意味着如果你想保留它,你应该保留它。

因此,如果methodWhoReturnString是您的方法,我相信为了遵守惯例,您应该return [stringToReturn autorelease];使用该方法,然后保留它,如果您想保留它。

答案 4 :(得分:0)

如果您将在稍后的某个时间点(即当前方法返回后)使用retain,则使用myString以防止其自动释放。

如果它只是当前方法中使用的临时变量,则不需要使用retain,因为在这种情况下,您确实希望将其自动释放。

一个特例是属性。如果您致电self.blah = foo,则无需保留foo,因为setBlah:方法应该为您执行此操作。

(其他一些复杂性和边缘情况,但这是一个很好的经验法则,让你开始理解该怎么做)

答案 5 :(得分:0)

根据您提供的代码,您不应该致电-retain。在您的示例中,返回NSString实例的方法的返回值被分配给myString,这是一个自动局部变量。如果已对实例变量或静态变量进行了赋值,则需要调用retaincopy以保证引用在本地范围结束后保持有效。

在这种情况下,对NSString实例的引用存储在一个变量中,该变量将在本地范围的末尾自动销毁,因此您的代码不需要关注对象的生命周期。