NSMutableString appendString 生成 SIGABRT 错误
Posted
技术标签:
【中文标题】NSMutableString appendString 生成 SIGABRT 错误【英文标题】:NSMutableString appendString generates SIGABRT Error 【发布时间】:2011-06-20 16:53:59 【问题描述】:这里是新人(这个论坛和一般的 Xcode),所以请多多包涵。
在过去的几天里,我花了几个小时断断续续地试图找出我到底做错了什么,但我似乎无法查明我的问题。
这是我的代码的相关部分(我相信)。
在标题中:
@interface BlahViewController : UIViewController
NSMutableString *display;
@property (nonatomic, retain) NSMutableString *display;
主要是:
@implementation BlahViewController
@synthesize display;
- (void)viewDidLoad
self.display = [[NSMutableString alloc] init];
- (void)anotherFunction:(UIButton *)sender
NSString *info = [[sender titleLabel] text];
[self.display appendString:info];
我运行代码,按下 UIButton,我得到一个错误。这是最初的抛出:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM appendString:]: unrecognized selector sent to instance 0x4e3d300' ***
谢谢!
编辑:请求了整个堆栈跟踪,所以在这里(在查看堆栈后,我意识到可能存在混淆,我目前正在编写一个非常基本的计算器,因此 ViewController 等应考虑该背景和“ anotherFunction" = "digitPressed" 在这种特殊情况下):
* 首次抛出时调用堆栈: (
0 CoreFoundation 0x00e345a9 异常预处理 + 185 1 libobjc.A.dylib 0x00f88313 objc_exception_throw + 44 2 CoreFoundation 0x00e360bb -[NSObject(NSObject) 不识别选择器:] + 187 3 CoreFoundation 0x00da5966 __转发 + 966 4 核心基础 0x00da5522 _CF_forwarding_prep_0 + 50 5 计算器 0x0000273b -[CalculatorViewController digitPressed:] + 113 6 UIKit 0x002bb4fd -[UIApplication sendAction:to:from:forEvent:] + 119 7 UIKit 0x0034b799 -[UIControl sendAction:to:forEvent:] + 67 8 UIKit 0x0034dc2b -[UIControl(内部)_sendActionsForEvents:withEvent:] + 527 9 UIKit 0x0034c7d8 -[UIControl touchesEnded:withEvent:] + 458 10 UIKit 0x002dfded-[UIWindow _sendTouchesForEvent:] + 567 11 UIKit 0x002c0c37 -[UIApplication sendEvent:] + 447 12 UIKit 0x002c5f2e _UIApplicationHandleEvent + 7576 13 图形服务 0x01723992 PurpleEventCallback + 1550 14 核心基础 0x00e15944 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION + 52 15 核心基础 0x00d75cf7 __CFRunLoopDoSource1 + 215 16 核心基础 0x00d72f83 __CFRunLoopRun + 979 17 核心基础 0x00d72840 CFRunLoopRunSpecific + 208 18 核心基础 0x00d72761 CFRunLoopRunInMode + 97 19 图形服务 0x017221c4 GSEventRunModal + 217 20 图形服务 0x01722289 GSEventRun + 115 21 UIKit 0x002c9c93 UIApplicationMain + 1160 22 计算器 0x00002254 主 + 102 23 计算器 0x000021e5 开始 + 53 ) 在抛出“NSException”实例后调用终止 当前语言:自动;目前objective-c
【问题讨论】:
'self.display = [[NSMutableString alloc] init];'线是内存泄漏。您应该改用self.display = [[[NSMutableString alloc] init] autorelease];
或 self.display = [NSMutableString string];
如果我在 viewDidUnload 方法中释放它是不是内存泄漏?因为现在的安排方式是 -viewDidLoad alloc/inits 和 -viewDidUnload 释放。
'display' 是一个具有 retain 内存管理的属性。因此,当您执行self.display = [[NSMutableString alloc] init];
时,它严格等同于[display release]; display = [[[NSMutableString alloc] init] retain];
,并且保留计数为2。如果您在 viewDidUnload 方法中有self.display = nil
,则将保留计数减一,因此仍有一些为字符串分配的内存,但无法再访问它。这是泄漏。
【参考方案1】:
* 由于未捕获而终止应用程序 例外 'NSInvalidArgumentException',原因: '-[__NSArrayM appendString:]: 无法识别的选择器发送到实例 0x4e3d300' *
这表明您正在调用appendString:
某种NSArray
的实例,这显然是行不通的。
假设[self.display appendString:info];
是异常的实际来源,那么它的发生是因为self.display
可能已被过度释放,并且巧合的是,NSArray
实例被分配在内存中的同一位置。
您可以使用僵尸检测来调试它。
或者,您可能在某处损坏了内存。或者,也许还有另一个分配给display
。
无论如何,只要发生崩溃,就会有回溯。请张贴。崩溃发生在其他地方的可能性很小。
5 Calculator 0x0000273b -[CalculatorViewController digitPressed:] + 113
显示digitPressed:
方法的源代码。
self.display = [[NSMutableString alloc] init];
那是内存泄漏;它将被保留两次。只需执行self.display = [NSMutableString string];
和self.display = nil;
(在您的viewDidUnload
中)。
但这不是问题的根源;某些东西正在重置display
变量或它被过度释放。显示display
的所有用法。
【讨论】:
错误出现在您指定的行。堆栈跟踪在编辑中提供。 尝试更改 NSMutableString 的名称,看看是否有帮助。 为什么更改可变字符串的名称会有帮助?!错误消息清楚地表明正在发生的事情,并且回溯显示它在digitPressed:
中偏离了轨道。
不确定你是否抓住了它,但“digitPressed”方法实际上是这里有问题的方法。 anotherFunction = digitPressed.
不——没听懂。不知道为什么有人会认为当执行明显在这一行上崩溃时重命名会有所帮助[如回溯所示]。以上是关于NSMutableString appendString 生成 SIGABRT 错误的主要内容,如果未能解决你的问题,请参考以下文章
__NSCFString appendString: Cocoa 中 NSMutableString 崩溃
如何用 NSMutableString 附加 NSMutableString?
[NSMutableString string] 和 [[NSMutableString string] autorelease] 一样吗?