我有两个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文件彼此不了解?
答案 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"