我有一个关于retain和NSString的问题,如果我有一个返回NSString的方法,并且我将返回的NSString放在一个nsstring变量中,我必须保留或不保留?
NSString *myString = @"";
myString = [self methodWhoReturnString]; // I must do this?
myString = [[self methodWhoReturnString]retain]; // Or I must do this?
答案 0 :(得分:5)
Apple Developer Documentation on Memory Management解释了保留/释放对象的方案。
简单地说,如果你想让琴弦粘在一起,你需要保留它直到你完成它。如果这只是当前函数的范围,你可以在不保留它的情况下离开,就像字符串已经自动释放一样(可能)在函数完成并清除当前的AutoReleasePool之前它不会被释放。
请记住,NSString *实际上可能指向NSMutableString *。如果您在没有意识到的情况下通过其他功能更改字符串对您很重要,请务必复制它:NSString * myCopyOfString = [mystring copy];
答案 1 :(得分:1)
如果字符串设置为autorelease,它很可能是,那么是的,你需要以某种方式保留它。我建议这样做:
myString = [[self methodWhoReturnString] copy];
这确保您保留字符串中的数据,而不仅仅是对可能仍在其他位置控制的字符串的引用。请务必稍后发布您的副本!
答案 2 :(得分:0)
其中包含alloc
,new
或copy
的任何方法都会自动保留并推断您拥有该对象的所有权。所有其他人不应该。如果你有更多的上下文会很有帮助。如果我们在一个包含的方法中短暂使用此字符串,那么您可能不需要保留。如果它将被使用一段时间,您可能希望使用@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
,这是一个自动局部变量。如果已对实例变量或静态变量进行了赋值,则需要调用retain
或copy
以保证引用在本地范围结束后保持有效。
在这种情况下,对NSString
实例的引用存储在一个变量中,该变量将在本地范围的末尾自动销毁,因此您的代码不需要关注对象的生命周期。