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
Objective c 目标c:可变范围_Objective C_C_Variables_Static_Scope - Fatal编程技术网

Objective c 目标c:可变范围

Objective c 目标c:可变范围,objective-c,c,variables,static,scope,Objective C,C,Variables,Static,Scope,很长一段时间以来,我一直在使用下面的1和3,最近使用4来定义我的变量 然而,我注意到还有其他有效的定义,对于Objective-C2来说可能是新的,通过将方法和它们的内部变量保持在一起,代码看起来会更好 有人能核实一下评论中的断言吗 static id var1; // 1. Shared among all classes and their instances defined in this file id var2; // 2. Same as 1? @implementation M

很长一段时间以来,我一直在使用下面的1和3,最近使用4来定义我的变量

然而,我注意到还有其他有效的定义,对于Objective-C2来说可能是新的,通过将方法和它们的内部变量保持在一起,代码看起来会更好

有人能核实一下评论中的断言吗

static id var1; // 1. Shared among all classes and their instances defined in this file

id var2; // 2. Same as 1?

@implementation MyClass
{
    id var3; // 3. Different variable for each instance
}

- (void)method
{
    static id var4; // 4.1. Not accessible from other methods
                    // 4.2. Different for each instance?
}

id var5; // 5. Same as 3? Same as 1/2?

static id var6; // 6.1. Same as 1?
                // 6.2. Not visible to other classes in this file?

@end
像一个这样的两个问题有点相似,但Objective-C可能有一些不同
=>仅在当前翻译单元中可见

id-var2
=>全局可见(又名外部)

id-var3
=>实例变量。创建实例时创建(
[Class alloc]

静态id var4
=>本地函数。在进程启动时创建。与var1的生存期相同,但仅在函数内部可见

id var5
=>与var2相同

静态id var6
=>与var1相同

Objective-C是一种忠实的C变体(IMHO:)

编辑了关于var4的不明确提及。

静态id var1
=>仅在当前翻译单元中可见

id-var2
=>全局可见(又名外部)

id-var3
=>实例变量。创建实例时创建(
[Class alloc]

静态id var4
=>本地函数。在进程启动时创建。与var1的生存期相同,但仅在函数内部可见

id var5
=>与var2相同

静态id var6
=>与var1相同

Objective-C是一种忠实的C变体(IMHO:)


编辑了关于var4的不明确提及。

属性是新的方式。为您提供自动的getter和setter,并且可以很好地使用ARC。我确实使用属性(在需要时为只读),而不是3,但用于真正私有的变量。所以一个属性等于3,对吗?你可以把属性放在头文件的@interface中,使它们成为“公共”属性。当然,这是通常的位置。我指的是私人变量。我想最干净的选择是将它们添加到私有的未命名类别中,并尽可能避免使用3。属性是一种新的方法。为您提供自动的getter和setter,并且可以很好地使用ARC。我确实使用属性(在需要时为只读),而不是3,但用于真正私有的变量。所以一个属性等于3,对吗?你可以把属性放在头文件的@interface中,使它们成为“公共”属性。当然,这是通常的位置。我指的是私人变量。我想最干净的选择是将它们添加到私有的未命名类别中,并尽可能避免3。
var4
的生存期与
var1
相同,但范围不同。你提到了这一点,然后说这是一样的,以此来破坏它。重要的是,位于大括号(
{
..
}
)之外的
@implementation
..
}
)内部不会影响变量范围或生存期。严格地说,
@interface
也没有,这是我见过的人犯的错误。所以我不能单独使用“4”吗?我的一个主要兴趣是避免当“3”只被一个实例方法使用时,就有一长串的“3”,而且我仍然不知道1和2之间的区别。这是否意味着链接时与另一个文件中名为相同的变量冲突?这是通过1避免的吗?@Rivera链接冲突,是的。2是
extern
extern
s用于从其他文件(类)访问变量。为了隐藏/封装内部数据结构,PIMPL习惯用法非常有用,并被许多人推荐使用:
var4
的生存期与
var1
相同,但范围不同。你提到了这一点,然后说这是一样的,以此来破坏它。重要的是,位于大括号(
{
..
}
)之外的
@implementation
..
}
)内部不会影响变量范围或生存期。严格地说,
@interface
也没有,这是我见过的人犯的错误。所以我不能单独使用“4”吗?我的一个主要兴趣是避免当“3”只被一个实例方法使用时,就有一长串的“3”,而且我仍然不知道1和2之间的区别。这是否意味着链接时与另一个文件中名为相同的变量冲突?这是通过1避免的吗?@Rivera链接冲突,是的。2是
extern
extern
s用于从其他文件(类)访问变量。为了隐藏/封装内部数据结构,PIMPL习惯用法非常有用,许多人推荐: