这对我没有意义。也许有人可以解释为什么会这样。
我有一个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"];
}
这一切看起来都很简单。我错过了什么?
答案 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。