现在一直在看这个并不理解为什么这个简单的代码会引发错误。缩短为简洁起见:
NSMutableString *output;
...
@property (nonatomic, retain) NSMutableString *output;
...
@synthesize output;
...
// logs "output start" as expected
output = [NSMutableString stringWithCapacity:0];
[output appendString:@"output start"];
NSLog(@"%@", output);
...
// error happens here
// this is later on in a different method
[output appendString:@"doing roll for player"];
有人能发现我的错误吗?
答案 0 :(得分:2)
更改行
output = [NSMutableString stringWithString:@"output start"]
到
[self setOutput:[NSMutableString stringWithString:@"output start"]]
(或self.output = ...
如果您更喜欢这种表示法。)
虽然您声明了一个属性,但您没有使用该setter,因此您不会保留该字符串。
答案 1 :(得分:1)
解决方案实际上与保留有关,如用户invariant所示。类方法:
output = [NSMutableString stringWithCapacity:0];
返回autorelease
NSMutableString。当分配给我的输出属性 - 看起来,即使使用retain标志 - 它也没有保留它。解决方案是自己分配它而不是自动释放:
output = [[NSMutableString alloc] initWithCapacity:0];
然后保留工作。任何关于为什么会受到欢迎的解释。
修改的
弄清楚原因。我直接访问实例变量而不是通过我合成的getter / setter。有关blog的更多信息。