我在运行应用程序时得到“Apple Mach-O Linker Error”

时间:2012-09-02 19:31:40

标签: ios xcode ios5

有人能告诉我为什么会得到这个   Undefined symbols for architecture i386: "_OBJC_CLASS_$_ScramblerModel", referenced from: objc-class-ref in ViewController.o ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation) 我的项目位于This zip

2 个答案:

答案 0 :(得分:5)

您的代码显然是引用此ScramblerModel类,但您尚未在项目中包含ScramblerModel.m文件。

首先,如果你看一下你的Compile Sources,就说:

no model included

继续并在添加模型时单击“+”按钮。您可能也希望为ScramblerPlayer执行此操作,因为您也使用该类,因此如果您不添加该类,则会出现另一个链接器错误。

now added scrambler model

其次,不要忘记告诉应用程序使用哪个故事板:

storyboard

第三,您的.h具有为所有IBOutlet属性定义的实例变量(ivars)。这是一个问题,因为您的@synthesize语句正在使用前导下划线实例化ivars,但您的.h(和您的代码)指的是没有连接到任何内容的重复的ivars。例如,您有一个属性remainingTime,您有一个@synthesize remainingTime = _remainingTime(正在创建一个_remainingTime ivar)。因此,显式声明的ivar remainingTime未与您的remainingTime属性相关联,因此如果您使用该ivar,则不会产生用户界面更新,尽管名称相似。

您可以通过以下方法解决问题并简化代码:(a)清除属性的明确声明的ivars; (b)更改您的代码以引用该属性,例如self.remainingTime或ivar _remainingTime。所以,你的.h被简化了,变成了:

//
//  ViewController.h
//  Scrambler
//
//  Created by Alex Grossman on 8/26/12.
//  Copyright (c) 2012 Alex Grossman. All rights reserved.
//

#import <UIKit/UIKit.h>

@class ScramblerModel;

@interface ViewController : UIViewController{
    ScramblerModel* gameModel;
    NSTimer* gameTimer;
}
@property (weak, nonatomic) IBOutlet UILabel *high;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *skipButton;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *restartButton;
@property (weak, nonatomic) IBOutlet UILabel *playerScore;
@property (weak, nonatomic) IBOutlet UILabel *remainingTime;
@property (weak, nonatomic) IBOutlet UILabel *scrambledWord;
@property (weak, nonatomic) IBOutlet UITextField *guessTxt;

-(IBAction)guessTap:(id)sender;
-(IBAction)restart:(id)sender;
-(IBAction)skip:(id)sender;
-(IBAction)category:(id)sender;
-(void) endGameWithMessage:(NSString*) message;

@end

编译项目时,会遇到很多错误,因为您的代码错误地引用了那些旧的,冗余的(和错误名称的)ivars。因此,例如,在您的viewDidLoad中,您有如下行:

remainingTime.text = [NSString stringWithFormat:@"%i", gameModel.time];
playerScore.text = [NSString stringWithFormat:@"%i", gameModel.score];

那些应该是:

self.remainingTime.text = [NSString stringWithFormat:@"%i", gameModel.time];
self.playerScore.text = [NSString stringWithFormat:@"%i", gameModel.score];

只要对你所指的那些错误的伊娃进行重复修正。

答案 1 :(得分:0)

如果您忘记将它们添加到项目构建阶段,您将收到错误“架构i386的未定义符号”。因此,将实现文件添加到Compile Sources,将Xib文件添加到Copy Bundle Resources。

Go to Scramblr Project -> Targets (Scrambl) -> Build Phases -> Complite Sources -> Add a ScramblerModel.m and ScramblerPlayer.m