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 崩溃
如何用 NSMutableString 附加 NSMutableString?
[NSMutableString string] 和 [[NSMutableString string] autorelease] 一样吗?