NSMutableString appendString生成SIGABRT

时间:2010-09-10 16:17:54

标签: iphone objective-c nsmutablestring

这对我没有意义。也许有人可以解释为什么会这样。

我有一个NSMutableString,我在我的iPhone应用程序的顶部分配,然后追加到稍后的过程中。它会产生一个SIGABRT,这对我来说并不重要。这是代码:

头文件(简化):

@interface MyAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    NSMutableString *locationErrorMessage;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, copy) NSMutableString *locationErrorMessage;

@end

主要的相关部分:

@implementation MyAppDelegate

@synthesize window;
@synthesize locationErrorMessage;

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

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

这一切看起来都很简单。我错过了什么?

3 个答案:

答案 0 :(得分:5)

我会称之为如何生成属性设置器的错误,但答案很简单:

您将该属性声明为(nonatomic, copy)。这意味着无论何时设置locationErrorMessage属性,它都将在新值上调用copy并将该副本用作属性值。

不幸的是,在copy上调用NSMutableString不会产生NSMutableString,会产生NSString(使用appendString:之类的内容无法进行变异})。

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

(我会说错误是:如果你将可变对象的属性声明为copy,那么副本设置器应该实际使用mutableCopy而不是copy)= &GT; rdar:// 8416047

答案 1 :(得分:2)

您的属性正在复制传入的字符串。副本始终是不可变的,因此您尝试将appendString:发送到不可变NSString。将您的属性声明为retain,它将工作或编写一个使用mutableCopy复制字符串的自定义setter。

您也有内存泄漏,您应该使用[NSMutableString string]而不是alloc-init序列。

答案 2 :(得分:0)

是的,你有泄漏,

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

您正在复制该值,但您永远不会释放实际首次分配的NSMutableString。