Objective c 保留并释放nsstring
Objective c 保留并释放nsstring,objective-c,release,retain,Objective C,Release,Retain,str是我自己的字符串。释放它是我的责任, 因为我调用了initWithString: if (![[str substringFromIndex:str.length-1] isEqualToString:@"\n"]) { str = [str stringByAppendingString:@"\n"]; } 如果到达if语句中的行,我将失去strvar的所有权 因此,当我稍后发布str时,我的应用程序与僵尸实例崩溃: [str release]; 如果if语句为NO(fals
str
是我自己的字符串。释放它是我的责任,
因为我调用了initWithString:
if (![[str substringFromIndex:str.length-1] isEqualToString:@"\n"])
{
str = [str stringByAppendingString:@"\n"];
}
如果到达if语句中的行,我将失去str
var的所有权
因此,当我稍后发布str
时,我的应用程序与僵尸实例崩溃:
[str release];
如果if语句为NO(false),则一切正常
我能做些什么来维护str的所有权
请注意,
str
可能很长,我不想初始化另一个NSString您需要执行正常的内存管理:
if (![[str substringFromIndex:str.length-1] isEqualToString:@"\n"])
{
NSString *newStr = [str stringByAppendingString:@"\n"];
[str release];
str = [newStr retain];
}
请记住,
stringByAppendingString:
返回一个自动删除的字符串(它还创建一个全新的字符串)。建议1:使用ARC。它为您解决了这些问题。这是迄今为止最好的解决办法
正如rmaddy所说,Xcode有一个将应用程序转换为ARC的自动化工具。查看编辑菜单中的重构>转换为Objective-C ARC下。这个过程相当轻松。它标记了它自己无法解决的问题(通常只有几件事)。当你解决了这些问题后,你就可以开始运行了,再也不用担心保留计数了
建议1a:按照@rmaddy的建议,将str设置为可变字符串
那么您的代码将如下所示:
self.str = [[NSString alloc] initWithFormat: @"number %d", value] autorelease];
[str appendString:@“\n”]
这更简单,更容易阅读,内存效率更高,在ARC和手动引用计数中的工作原理完全相同
否则,将str更改为保留属性
@property (nonatomic, retain) NSString *str);
然后使用属性表示法:
if (![[self.str substringFromIndex: self.str.length-1] isEqualToString:@"\n"])
{
self.str = [self.str stringByAppendingString:@"\n"];
}
执行此操作时,属性的setter会在为属性指定新值之前释放str属性中的旧对象
但是,请注意,将对象指定给保留属性会增加其保留计数。这将造成泄漏:
self.str = [NSString alloc] initWithFormat: @"number %d", value];
(因为所有alloc/init调用都返回retain计数为1的对象)
然后财产又保留了它
代码应该这样编写:
self.str = [[NSString alloc] initWithFormat: @"number %d", value] autorelease];
仅供参考-调用
stringByAppendingString:
会init
一个全新的字符串。rly?:)但也许旧字符串会在之前被释放:)?@rmaddy你有什么建议?我可以问你为什么不使用ARC吗?现在是2015年。除非迫不得已,否则不要让生活变得更艰难。“你有什么建议?”使用ARC。Xcode使转换变得很容易。在不创建新SRT的情况下,是否可以向str添加新行?只有一种方法-使用NSMutableString
。