我需要连接一些字符串。
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,它在加载后崩溃:(。
答案 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"];