在第一个IOS项目Xcode 4中获取信号SIGABRT

时间:2012-08-23 11:00:33

标签: ios xcode ios5 xcode4 sigabrt

我正在尝试在IO中创建我的第一个测试应用程序,我所做的一切都让我错误。我正在使用xcode 4.4。

该应用程序非常简单。它有一个按钮,当我按下它时,必须出现标签和图像视图。

我的整个代码是:

ViewController.h


//
//  ViewController.h
//  helloWorld_04
//
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController{

    IBOutlet UILabel *label;
    IBOutlet UIImageView *Kant;
}
@property (nonatomic, retain) IBOutlet UILabel *label;
@property (nonatomic, retain) IBOutlet UIImageView *Kant;
- (IBAction)buttonGuess:(id)sender;

@end

和我的实施文件:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize label,Kant;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}



- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (void)dealloc {
    [label release];
    [Kant release];
    [super dealloc];
}
- (IBAction)buttonGuess:(id)sender {
    label.text=@"Hello World i am back!";
    UIImage *imageSource=[UIImage imageNamed:@"kantStair.png"];
    Kant.image=imageSource;
}
@end

我的错误日志是:

2012-08-23 13:38:50.030 helloWorld_04[537:c07] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<ViewController 0x6a5e1f0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key image.'
*** First throw call stack:
(0x14b2022 0xeb2cd6 0x14b1ee1 0x9c3022 0x934f6b 0x934edb 0x94fd50 0x23771a 0x14b3dea 0x141d7f1 0x23626e 0xdc1fc 0xdc779 0xdc99b 0x3b401 0x3b670 0x3b836 0x4272a 0x2d1b 0x13386 0x14274 0x23183 0x23c38 0x17634 0x139cef5 0x1486195 0x13eaff2 0x13e98da 0x13e8d84 0x13e8c9b 0x13c65 0x15626 0x2a22 0x2995)
terminate called throwing an exception(lldb) 

它让我在那一行发出信号:

//
//  main.m
//  helloWorld_04
//

//

#import <UIKit/UIKit.h>

#import "AppDelegate.h"

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

我在这里已经阅读了几个答案,但没有找到解决我的问题,这就是为什么我把它作为一个新问题。我认为这可能是连接的一个问题,所以我自己做的就是“把我的标签和我的图像”“删除”到“文件所有者”但仍然得到错误。

2 个答案:

答案 0 :(得分:3)

查看您的错误消息,看起来您在Interface Builder中定义了image,但不存在。例如,也许你有类似的东西:

Sample IB screen

但是你没有image财产。您曾经有过一次,也许已将其重命名为Kant?如果您在Interface Builder中定义了类似的内容,请将其删除(通过点击我突出显示的插座旁边的“x”),然后将其再次链接到您的新控件。


<强>更新

你绝对应该修复上面的错误,希望上述观察可以帮助你找到它。您的代码中没有错误,但问题无疑取决于您的Interface Builder链接。

但是,话说回来,如果你是一名新的程序员,我希望你不要介意一些不请自来的风格观察。很明显,鉴于它是一个风格问题,这些可以辩论,但我认为这些都代表已建立或新兴的iOS编码标准。无论如何,我可能会建议将来:

  1. 像David H建议的那样,你应该使用小写变量名。

  2. 您可能应该有@synthesize个语句,或者说@synthesize label = _label,或者,如果您使用的是Xcode 4.4或更高版本,则只需省略@synthesize语句。 (我知道Interface Builder可以为您生成一个简单的@synthesize语句,但@synthesize的最佳做法是使用唯一的实例变量名,这样您就不会意外地将实例变量与属性混淆。)

  3. 您应该在initdealloc方法中引用您的实例变量(即带有前导下划线的变量名称)和其他地方使用属性(带有前导self.) ,如Born Survivor所述。

  4. 您可能应该省略实例变量并让@synthesize语句为您执行这些操作(因此,如果您输入错误,则不会意外地得到两个实例变量)。

  5. 因此,您的代码将成为:

    //  ViewController.h
    
    #import <UIKit/UIKit.h>
    
    @interface ViewController : UIViewController
    
    // note, no braces with instance variables defined
    // once upon a time that was recommended by Apple, but no longer
    // just let the following @property statements and the subsequent
    // @synthesize statement generate the instance variables for you.
    
    @property (retain, nonatomic) IBOutlet UIImageView *kant; // note the lower case "k"
    @property (retain, nonatomic) IBOutlet UILabel *label;
    
    - (IBAction)buttonGuess:(id)sender;
    
    @end
    

    //  ViewController.m
    
    #import "ViewController.h"
    
    @implementation ViewController
    
    @synthesize label = _label;  // note the @synthesize statement let's us define what the instance variable name should be, _label in this case
    @synthesize kant  = _kant;
    
    - (void)viewDidUnload
    {
        [self setKant:nil];
        [self setLabel:nil];
        [super viewDidUnload];
        // Release any retained subviews of the main view.
    }
    
    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    }
    
    - (void)dealloc {
        [_kant release];  // note I'm now using the instance variables that begin with the underscore
        [_label release];
        [super dealloc];
    }
    
    - (IBAction)buttonGuess:(id)sender
    {
        self.label.text = @"Hello World i am back!";  // note, I'm using the properties with the preceding "self."
        UIImage *imageSource = [UIImage imageNamed:@"kantStair.png"];
        self.kant.image = imageSource;
    }
    
    @end
    

答案 1 :(得分:0)

在ObjectiveC中,重要的是总是用小写字母命名变量 - 因为当你合成一个像“foo”这样的变量时,你得到“ - (id)foo; // getter”和“ - (void)setFoo: (id)val; // setter“。了解setter如何使用大写字母。所以你要做的第一件事就是将'康德'重命名为'康德'。 [按惯例,只有类有首字母大写字母,所以你可以帮助像我这样的人按照约定阅读你的代码。]

首先,你要做的是将'Kant'改为'kant',然后返回Interface builder视图并将新命名的变量重新连接到UIImageView。

如果这不能解决问题,那么你有一个'kant'或者还有其他奇怪的事情 - 在你设置图像之前添加这行代码:

NSLog(@"kant has class %@", NSStringFromClass([kant class]) );

让我们看看它到底是什么。