stringByAppendingString出现问题并保留计数

时间:2011-05-20 06:06:12

标签: objective-c

我需要连接一些字符串。

NSString * sportName = [[NSString alloc ]initWithString:@""];
sportName = [sportName stringByAppendingString:[someObject getString]];
// can be more stringByAppendingString
...
[sportName release];

但对我来说奇怪的是给出“构建和分析”命令:

on string:

sportName = [sportName stringByAppendingString:[someObject getString]]; 

错误: 方法返回一个具有+0保留计数(非拥有引用)的Objective-C对象

on string:

[sportName release];

错误:     调用者

此时不拥有的对象的引用计数的不正确递减

我用它来填充我的TableView,它在加载后崩溃:(。

3 个答案:

答案 0 :(得分:2)

NSString * sportName = [[NSString alloc ]initWithString:@""];
sportName = [sportName stringByAppendingString:[someObject getString]];

在第二行,您将获得一个新的字符串,该字符串被分配回spotName。所以第一行中的分配字符串被泄露了。我不明白为什么你需要附加一个空字符串。附加到@""几乎没有效果。如果你有一些非空字符串,那么你可以创建它作为自动释放的字符串而不是alloc。像这样:

// create an autoreleased string
NSString * sportName = @"my_string";
// this will return a new string which is also autoreleased
sportName = [sportName stringByAppendingString:[someObject getString]];
// all subsequent call to stringByAppendingString will return autoreleased string
//so no need to release spotName

如果你需要保留spotName,那么你可以保留或使用财产。

答案 1 :(得分:0)

好吧,如果你只是在一个方法中使用它,为什么你需要分配(并保留)你的字符串(看起来像)......

试试这个:

NSString * sportName = @"";

而不是“alloc”:

并删除发布行......

答案 2 :(得分:0)

您首先通过发送alloc(或new,copy,mutableCopy,retain)来拥有sportName。现在你有一个新的实例,你必须稍后发布。

stringByAppendingString返回您分配给sportName的自动释放字符串。引用丢失,永远不会被释放。

查看内存地址:

NSString *sportName = [[NSString alloc ]initWithString:@"baa"];
NSLog(@"<%p> %@", sportName, sportName);
sportName = [sportName stringByAppendingString:@" foo"];
NSLog(@"<%p> %@", sportName, sportName);

输出:

2011-05-20 08:19:08.675 foo[1262:207] <0x3038> baa
2011-05-20 08:19:08.677 foo]1262:207] <0x4e40bd0> baa foo

sportname已被覆盖。

您可以通过引入tmp或使用字符串文字来解决这个问题:

NSString *sportName = @"baa";

...
NSString *tmp = [sportName stringByAppendingString:@" foo"];