为什么我得到" Apple Mach -O Linker错误"?

时间:2014-03-21 07:25:56

标签: objective-c

我有两个UIViewControllers。它们有两个名称相同但位于不同文件中的变量。

HomeViewController.h

#import <UIKit/UIKit.h>

@interface HomeViewController : UIViewController

@end

HomeViewController.m

#import "HomeViewController.h"
#import "DetailViewController.h"

@interface HomeViewController ()

@end

@implementation HomeViewController
bool search=true;
bool dbOpen=false;

....

@end

DetailViewController.h

#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController

@end

DetailViewController.m

#import "DetailViewController.h"

@interface DetailViewController ()

@end

@implementation DetailViewController
bool search=true;
bool dbOpen=false;

....

@end

当我从HomeViewController.m或DetailViewController.m文件中删除“search”和“dbOpen”变量时,它会成功编译。为什么会这样?变量不在头文件中,m文件彼此不了解?

4 个答案:

答案 0 :(得分:1)

全局变量(你拥有的)是全局变量,如果它们位于不同的文件中(也使它们变得危险)也无关紧要。

bool search;

全局只能定义一次,否则会出现链接器错误。人们也会在社交活动中避开你。

静态变量是每个文件 - 这可能就是你的意思..

static bool search;

实例变量是每个实例。这可能就是你的意思。您应该首先使用Properties - 编译器将处理添加支持它的实例变量。 有点像:

@property bool search;

我相信你的意思是使用bool而不是Objective-c类型的BOOL。可见性取决于您。如果要将其公开,请在接口中定义属性。

如果你真的不想要一个属性,你应该在接口部分定义你的实例变量。

@interface HomeViewController : UIViewController {
  bool search;
}
@end

只是为了让它更令人困惑..如果你真的必须在实现中定义实例变量有一种方法,但我不能让自己键入它。

答案 1 :(得分:0)

这是使用全局变量的经典错误。尽量避免使用它。通常使用extern关键字。

  

使用带有全局变量的extern来创建明确的   声明。除了帮助编译器,它还提供了线索   任何人都在阅读全局变量定义的代码(和   可能已在其他地方初始化了,但你只是在这里使用它

#import "DetailViewController.h"

@interface DetailViewController ()

@end

@implementation DetailViewController
extern bool search=true;
extern bool dbOpen=false;

....

@end

答案 2 :(得分:0)

变量声明必须在@interface之内:

@interface HomeViewController ()
    BOOL search;
    BOOL dbOpen;
@end

@interface DetailViewController ()
    BOOL search;
    BOOL dbOpen;
@end

要设置初始值,请在考试中添加作业,e viewDidLoad

- (void)viewDidLoad
{
    search = YES;
    dbOpen = NO;
}

请注意其他更改,例如BOOL和YES / NO。

答案 3 :(得分:0)

因为你已经声明了这些变量

bool search=true;
bool dbOpen=false;

作为全局,这些变量只能出现一次。在"HomeViewController.m""DetailViewController.m"

中更改全局变量的名称