iOS:理解全局变量
在我的第一个iOS:理解全局变量,ios,objective-c,xcode,variables,global-variables,Ios,Objective C,Xcode,Variables,Global Variables,在我的第一个ViewControllerViewControllerTest1中,我得到了一个名为counter的全局变量。 计数器应该在我的应用程序中不时增加。一切正常: @implementation ViewControllerTest1{ int counter = 0; -(void)viewDidLoad {...} -(void)method {...} } 现在,如果我在第二个ViewControllerViewControllerTest2XCode中声明另一个名为cou
ViewController
ViewControllerTest1
中,我得到了一个名为counter
的全局变量。
计数器
应该在我的应用程序中不时增加。一切正常:
@implementation ViewControllerTest1{
int counter = 0;
-(void)viewDidLoad
{...}
-(void)method {...}
}
现在,如果我在第二个ViewController
ViewControllerTest2
XCode中声明另一个名为counter
的全局变量,则会给出一个错误
我知道我可以给它取一个不同的名字,但为什么会这样呢?我是否可以确保只有处于活动状态的ViewController
的全局文件在我的内存中
或者我现在正在做一些类似于禁止的事情,比如counter
?
有更好的方法吗?如果您希望某个符号特定于某个文件,请在声明它时使用
static
关键字
你的声明应该是
static int counter = 0;
在链接时(编译所有文件后),全局符号在同一个文件中混合,因此,如果两个共享相同的名称,链接器将触发错误。如果在文件范围(包括类定义内但在ivar区域或方法体外的位置)定义变量,默认情况下,它将具有
extern
链接,这需要唯一的符号名称
将其设置为static
变量(static int…
),问题将得到解决,因为静态符号名称只需要在声明它们的文件中是唯一的
如果您有意在此文件之外访问此变量,因此需要维护
extern
链接,您需要将另一个变量命名为其他名称以区分这两个变量。如果您想要特定于接口的全局变量,请将其设置为同一接口中的成员…在.h文件中声明接口内部您发布的代码无效。花括号错了。请修复它们,因为如果close curly确实位于int counter
之后,那么您没有全局变量,您有一个私有实例变量。符号冲突发生在链接过程中。如果两个文件都声明相同的符号,则会发生重复符号冲突。另一种解决方法是将一个声明标记为extern
(通常在与声明实际全局的实现文件相对应的头文件中执行)。@bbum在我回答时,您发表了评论。你觉得我这个版本的答案对吗?我不想在其中提到extern
,因为在op案例中没有任何用处。@tomah您仍然声明错误来自编译器。是链接器抱怨重复的符号。是的——也是向上投票的,同时更改我的注释,以表明如果变量被认为是真正全局的,则可以使用另一种解决方案。