2010-11-17 69 views
1

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

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

除了答案中的内容之外,如果您实际存储以供将来使用,则只需保留/复制它。如果你立即使用它,那么即使是一个自动释放对象也没问题。 – Eiko 2010-11-17 15:44:07

回答

5

Apple Developer Documentation on Memory Management解释了您保留/释放对象的场景。

简而言之,如果你想让字符串四处走动,你需要保留它直到完成它。如果这只是当前函数的范围,那么您可以在不保留它的情况下离开,就好像该字符串已经autorelease'd(可能),直到函数完成并清除当前的AutoReleasePool后才会释放该字符串。

请记住,NSString *实际上可能指向一个NSMutableString *。如果如果字符串是由一些其他功能,无需你意识到改变其对你很重要,一定要复制:NSString * myCopyOfString = [mystring copy];

0

allocnewcopy中,它会自动保留并推断你有对象的所有权的任何方法。所有其他人不应该。如果你有更多的上下文,这将是有益的。如果我们在一个简单使用这个字符串的包含方法中,那么你可能不需要保留。如果将要使用一段时间,则可能需要使用@synthesize语法使其成为您所在班级的一个属性。当您使用@property@synthesize并调用类似self.myProperty = something时,它将自动保留。

+0

这是错误的。如果你用'alloc'或'new'创建它,或者如果你用包含'copy'的方法获得它,或者你保留它'',那么你拥有这个对象。 'init'对保留计数没有任何作用。我会投票,但有关创建财产的东西是很好的建议。 – JeremyP 2010-11-17 16:10:32

+0

@JeremyP你是对的。它是alloc,new *和* copy。我混淆了他们。抱歉。 – 2010-11-17 17:01:49

+0

说'self.myProperty = something'会自动调用'-retain'也是不正确的。只有当属性用'retain'而不是'-copy'或'assign'声明为内存管理语义时,才会出现这种情况。 – jlehr 2010-11-17 17:02:16

1

如果字符串设置为自动释放,最有可能的是,那么您需要以某种方式保留它。我建议这样做虽然:

myString = [[self methodWhoReturnString] copy]; 

这样可以保证你的字符串不仅仅是一个可能仍然在其他地方控制的串参考保留数据。请务必在稍后发布您的副本!

0

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

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

0

如果您打算在稍后的时间点(即在当前方法返回后)使用myString以防止自动发布,则使用retain

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

一个特例是属性。如果您拨打self.blah = foo,则不需要保留foo,因为setBlah:方法应该为您做。

(还有其他的复杂性和边缘情况的整个负载,但这是一个好的经验法则,让你开始在理解要做什么)

0

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

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