1

有人能告诉我为什么我得到
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) 我的项目在这个 zip

4

2 回答 2

5

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

所以,首先,如果你看一下你的Compile Sources,它会说:

不包括模型

继续并在添加您的模型时单击“+”按钮。您可能也想为 执行此操作ScramblerPlayer,因为您也使用该类,所以如果您不添加它,您将收到另一个链接器错误。

现在添加了扰频器模型

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

故事板

第三,您的 .h 为您的所有属性定义了实例变量 (ivars) IBOutlet。这是一个问题,因为您的@synthesize语句使用前导下划线实例化 ivars,但您的 .h (和您的代码)指的是没有连接到任何东西的重复 ivars。例如,你有一个属性remainingTime,你有一个@synthesize remainingTime = _remainingTime(正在创建一个_remainingTimeivar)。因此,您明确声明的 ivarremainingTime未连接到您的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];

只需对您提到错误的 ivars 的任何地方重复此更正即可。

于 2012-09-02T19:42:46.767 回答
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
于 2012-09-02T19:43:05.337 回答