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