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