计算器程序中的断言失败

时间:2013-01-11 23:04:25

标签: iphone ios objective-c macos cocoa

所以我正在研究一个简单的计算器程序,以适应可可和目标C.我已经多次重做整个事情,每次我完成编码,第一次构建它,它工作正常,但每次之后窗口都不会启动,它会给我这些错误:

2013-01-11 10:32:14.760 Visual Caluclator Fix[39892:403] *** Assertion failure in -[NSTextFieldCell _objectValue:forString:errorDescription:], /SourceCache/AppKit/AppKit-1138.47/AppKit.subproj/NSCell.m:1564
2013-01-11 10:32:14.762 Visual Caluclator Fix[39892:403] Ignoring exception raised in __-[NSPersistentUIManager restoreAllPersistentStateWithTalagentWindows:registeringAsReadyWhenDone:completionHandler:]_block_invoke_3: Invalid parameter not satisfying: aString != nil

我的结论是问题出在我的textEdited方法中,因为当我将其中的代码注释掉时,程序运行没有问题;但是,我不知道为什么会这样,或者为什么它会在第一次运行而不是随后的运行。当我输入一个异常断点时,它指向updateUI方法中的一行和textEdited方法中对[self updateUI]的调用。下面的代码是textEdited方法和它引用的其他方法。(我很确定解决方法没有任何问题,因为我在命令提示计算器中使用它并且效果很好。而且,我知道这是一个非常复杂的问题使用字符串和所有内容编写计算器的方法,但我只是尝试将已经用于命令提示程序的代码集成到cocoa程序中。)

在AppDelegate类中:

- (void)updateUI{
    [self.calculationView setStringValue: self.calculation.calcString];//Exception breakpoint points here
}

- (IBAction)textEdited:(id)sender {
    self.calculation.calcString = self.calculationView.stringValue;
    [self.calculation solve];
    [self updateUI];//Exception breakpoint points here
}

在计算类中:

- (NSString*)solve{
    for (int i = 0; i < [self.calcString length]; i++) {
        NSRange nextChar = NSMakeRange(i, 1);
        if ([[self.calcString substringWithRange: nextChar] isEqualToString: @"*"]||
            [[self.calcString substringWithRange: nextChar] isEqualToString: @"/"])
            [self calcTerm: i];
    }
    for (int i = 0; i < [self.calcString length]; i++) {
        NSRange nextChar = NSMakeRange(i, 1);
        if ([[self.calcString substringWithRange: nextChar] isEqualToString: @"+"]||
            [[self.calcString substringWithRange: nextChar] isEqualToString: @"-"])
            [self calcTerm: i];
    }
    return self.calcString;
}

2 个答案:

答案 0 :(得分:1)

这可能会对您的问题有所帮助:

http://www.raywenderlich.com/10505/my-app-crashed-now-what-part-2

该网站解释了断言错误的工作原理,并演示了如何修复错误。

答案 1 :(得分:0)

我觉得calcTerm:中的某些内容正在设置calcStringnil。因此,当您稍后检索它以将字段的字符串值设置为它时,您最终将字段的字符串值设置为nil,它不喜欢它。

您可以在calcString结尾之前记录solve的值来检查此问题。然后,开始在calcTerm:中添加日志语句和/或断点,以了解如何交换nil的字符串。