【问题标题】:Appending Strings to NSMutableString将字符串附加到 NSMutableString
【发布时间】:2010-04-01 05:56:54
【问题描述】:

现在看了一会儿,不明白为什么这个简单的代码会引发错误。为简洁起见缩短:

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"];

谁能看出我的错误?

【问题讨论】:

  • 确切的错误是什么?

标签: objective-c nsmutablestring


【解决方案1】:

换行

output = [NSMutableString stringWithString:@"output start"]

[self setOutput:[NSMutableString stringWithString:@"output start"]]

(或self.output = ...,如果您喜欢这种表示法)。

虽然你声明了一个属性,但你没有使用 setter,所以你没有保留字符串。

【讨论】:

  • 真的吗?嗯,很高兴知道。我想当我 @synthesize 一个变量时,它会为我做到这一点。
【解决方案2】:

正如用户invariant 所指出的那样,该解决方案实际上确实与保留有关。类方法:

output = [NSMutableString stringWithCapacity:0];

返回一个autorelease NSMutableString。当分配给我的输出属性时——看起来,即使有保留标志——它也没有保留它。解决方案是自己分配而不是自动释放:

output = [[NSMutableString alloc] initWithCapacity:0];

然后保留工作。任何解释为什么都会非常受欢迎。

编辑

找出原因。我直接访问实例变量,而不是通过我合成的 getter/setter。有关我的blog 的更多信息。

【讨论】:

  • AppleDevForums 的 Rufus 对类似的事情给出了很好的答案:
  • 这非常令人困惑,您需要知道的 7 或 8 件事才能最终变得有意义。首先,相信self.foo = bar;[self setFoo:bar]; (语法快捷方式)完全相同,即“在我(此对象)上“调用方法“setFoo:bar”。”现在你会问自己,“嗯?我没有写任何“setFoo”方法。”没错,你没有。 @synthesize 指令告诉编译器编写“setFoo”方法。
  • 而且编译器并没有为你提供它为你编写的这个方法的源代码。但是这个隐藏的“setFoo:”方法有什么作用呢? 1. 检查“bar”是否已经是“foo”设置的值。 2. 如果不是,则发送“release”消息给“foo” 3. 将指针“foo”设置为指针“bar” 4. 发送“retain”消息给“foo”(如果 @property 指令对于“foo”说要这样做)。
  • 所以通过使用self.foo = bar,它被转换为[self setFoo:bar],foo 最终指向一个保留对象。如果您只编码foo=bar; 而不使用self.foo=bar,则不会调用 setFoo: 方法并且不会完成保留。
  • @Emil 确实如此。我没有更新这个问题,但不久前我自己也发现了同样的问题:typeoneerror.com/blog/post/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2015-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
相关资源
最近更新 更多