NSMutableString appendString 生成一个 SIGABRT

Posted

技术标签:

【中文标题】NSMutableString appendString 生成一个 SIGABRT【英文标题】:NSMutableString appendString generates a SIGABRT 【发布时间】:2010-09-10 16:17:54 【问题描述】:

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

我有一个 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"];

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

【问题讨论】:

肯定还有一些其他相关的代码你没有显示...也许发布崩溃日志,它可能会有所帮助 【参考方案1】:

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

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

不幸的是,在NSMutableString 上调用copy 不会产生NSMutableString,它会产生NSString(不能使用appendString: 之类的东西对其进行变异)。

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

以上是关于NSMutableString appendString 生成一个 SIGABRT的主要内容,如果未能解决你的问题,请参考以下文章

__NSCFString appendString: Cocoa 中 NSMutableString 崩溃

ios appendstring怎么用

如何用 NSMutableString 附加 NSMutableString?

[NSMutableString string] 和 [[NSMutableString string] autorelease] 一样吗?

NSString 和 NSMutableString

可变字符串NSMutableString