3

这对我来说毫无意义。也许这里有人可以解释为什么会发生这种情况。

我有一个 NSMutableString,我在 iPhone 应用程序的顶部分配了它,然后在该过程的后面附加。它会导致一个 SIGABRT,这对我来说并不重要。这是代码:

头文件(简化):

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

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

@end

以及Main的相关部分:

@implementation MyAppDelegate

@synthesize window;
@synthesize locationErrorMessage;

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

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

这一切似乎都很简单。我错过了什么?

4

3 回答 3

5

我会将此称为属性设置器生成方式的错误,但答案非常简单:

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

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

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

(我会说错误是:如果您将可变对象的属性声明为copy,那么复制设置器实际上应该使用mutableCopy而不是copy)=> rdar://8416047

于 2010-09-10T16:23:36.937 回答
2

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

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

于 2010-09-10T16:23:59.023 回答
0

顺便说一句,你那里有泄漏,

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

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

于 2011-12-16T15:15:57.080 回答