Iphone NSMutableString appendString生成SIGABRT

Iphone NSMutableString appendString生成SIGABRT,iphone,objective-c,nsmutablestring,Iphone,Objective C,Nsmutablestring,这对我来说毫无意义。也许这里有人能解释为什么会这样 我在iPhone应用程序的顶部分配了一个NSMutableString,然后在稍后的过程中附加到它。它会导致一个SIGABRT,这和我不一样。代码如下: 头文件(简化): 这一切似乎都很简单。我遗漏了什么?在属性设置程序的生成过程中,我会称之为一个bug,但答案很简单: 您将属性声明为(非原子,复制)。这意味着无论何时设置locationErrorMessage属性,它都将对新值调用copy,并将该副本用作属性值 不幸的是,对NSMutable

这对我来说毫无意义。也许这里有人能解释为什么会这样

我在iPhone应用程序的顶部分配了一个NSMutableString,然后在稍后的过程中附加到它。它会导致一个SIGABRT,这和我不一样。代码如下:

头文件(简化):


这一切似乎都很简单。我遗漏了什么?

在属性设置程序的生成过程中,我会称之为一个bug,但答案很简单:

您将属性声明为
(非原子,复制)
。这意味着无论何时设置
locationErrorMessage
属性,它都将对新值调用
copy
,并将该副本用作属性值

不幸的是,对
NSMutableString
调用
copy
不会产生
NSMutableString
,而是会产生
NSString
(不能使用类似
appendString:
的方法进行变异)

因此,简单的解决方法是将属性声明从
copy
更改为
retain


(我想说的是错误是:如果您将可变对象的属性声明为
copy
,那么复制设置程序实际上应该使用
mutableCopy
,而不是
copy
)=>rdar://8416047您的属性正在复制传入的字符串。副本总是不可变的,因此您试图将
appendString:
发送到不可变的
NSString
。将属性声明为
retain
,它将工作或编写自定义setter,使用
mutableCopy
复制字符串


您还存在内存泄漏,您应该使用
[NSMutableString]
而不是
alloc init
序列。

顺便说一句,您存在泄漏

self.locationErrorMessage = [[NSMutableString alloc] init];

您正在复制该值,但从未释放实际分配的第一个NSMutableString。

一定有其他相关代码未显示……发布崩溃日志可能会有所帮助
@implementation MyAppDelegate

@synthesize window;
@synthesize locationErrorMessage;

- (void)applicationDidFinishLaunching:(UIApplication *)application {
    self.locationErrorMessage = [[NSMutableString alloc] init];  
}

- (void)anotherFunction {
    [self.locationErrorMessage appendString: @"Blah Blah Blah"];
}
self.locationErrorMessage = [[NSMutableString alloc] init];