NSMutableString appendString生成SIGABRT错误

时间:2011-06-20 16:53:59

标签: iphone xcode

这里有新的(这个论坛和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 exceptionPreprocess + 185
    1 libobjc.A.dylib 0x00f88313 objc_exception_throw + 44
    2 CoreFoundation 0x00e360bb - [NSObject(NSObject)doesNotRecognizeSelector:] + 187
    3 CoreFoundation 0x00da5966 __ 转发
+ 966
    4 CoreFoundation 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 GraphicsServices 0x01723992 PurpleEventCallback + 1550
    14 CoreFoundation 0x00e15944 CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION + 52
    15 CoreFoundation 0x00d75cf7 __CFRunLoopDoSource1 + 215
    16 CoreFoundation 0x00d72f83 __CFRunLoopRun + 979
    17 CoreFoundation 0x00d72840 CFRunLoopRunSpecific + 208
    18 CoreFoundation 0x00d72761 CFRunLoopRunInMode + 97
    19 GraphicsServices 0x017221c4 GSEventRunModal + 217
    20 GraphicsServices 0x01722289 GSEventRun + 115
    21 UIKit 0x002c9c93 UIApplicationMain + 1160
    22计算器0x00002254 main + 102
    23计算器0x000021e5开始+ 53
  )
  抛出'NSException'实例后终止调用   当前语言:auto;目前的目标-c

1 个答案:

答案 0 :(得分: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的所有用途。