Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:理解全局变量_Ios_Objective C_Xcode_Variables_Global Variables - Fatal编程技术网

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您仍然声明错误来自编译器。是链接器抱怨重复的符号。是的——也是向上投票的,同时更改我的注释,以表明如果变量被认为是真正全局的,则可以使用另一种解决方案。