当我们创建NSString对象时,是否需要释放它?
当我为我的应用程序运行静态分析器时,我得到以下
NSString *dataStr=[[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding]; Method returns an Objective-C object with a +1 retain count (owning reference)
答案 0 :(得分:3)
神奇的单词是alloc
,copy
和retain
:如果在创建对象或声明属性时使用了其中任何一个,则需要{{1}它。
答案 1 :(得分:3)
静态分析器说这是因为你的方法名称并不意味着方法的调用者拥有你要返回的对象的所有权。有几个解决方案:
修改方法的名称,使其隐含所返回对象的所有权,即这些名称意味着所有权,因为它们以“new”开头或包含“copy”一词:
- (NSString *) newDataString
- (NSString *) copyDataString
如果您使用上述方法名称,则意味着该方法的调用者负责在完成对象时发送release
消息。
修改您的方法,以便在使用autorelease
方法返回对象之前放弃该对象的所有权:
- (NSString *) dataString
{
NSString *tmp = [[NSString alloc] initWithFormat:@"%f", 2.444];
return [tmp autorelease];
}
请注意,每个alloc
,copy
或retain
必须与release
或autorelease
平衡(但不能同时!)。
阅读Cocoa Memory Management Rules。这些规则不是可选的,您必须遵循它们。规则也很简单。经过一些练习,他们将成为第二天性。
答案 2 :(得分:1)
是的,你需要发布它。通常,每次创建调用alloc
的对象指针时,都需要调用release
。
答案 3 :(得分:1)
是的,你需要发布它。必须释放每个具有保留计数的变量。