NSMutableString appendString生成SIGABRT

Axe*_*eva 3 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
Run Code Online (Sandbox Code Playgroud)

主要的相关部分:

@implementation MyAppDelegate

@synthesize window;
@synthesize locationErrorMessage;

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

- (void)anotherFunction {
    [self.locationErrorMessage appendString: @"Blah Blah Blah"];
}
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ong 5

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

你宣布该财产为(nonatomic, copy).这意味着无论何时设置locationErrorMessage属性,它都将调用copy新值并将该副本用作属性值.

不幸的是,调用copya NSMutableString不会导致a NSMutableString,它会导致NSString(不能使用类似的东西进行变异appendString:).

所以简单的解决方法是将属性声明更改copyretain.

(我会说这个bug会是:如果你声明一个可变对象的属性copy,那么副本设置器应该实际使用mutableCopy而不是copy)=> rdar:// 8416047