Objective-C 中的静态变量——它们有啥作用?
Posted
技术标签:
【中文标题】Objective-C 中的静态变量——它们有啥作用?【英文标题】:static variables in Objective-C - what do they do?Objective-C 中的静态变量——它们有什么作用? 【发布时间】:2011-06-25 07:15:53 【问题描述】:我看过一些讨论什么是静态变量的帖子,我想我明白了 - 但我很想快速编写(或找到)一个同时使用常规变量和静态变量的程序,并排,并查看它们如何/何时以不同方式运行。一些快速的脏代码,可能是两个 int vars 和几个 NSLog 跟踪语句,只是为了看看它们有什么不同。
有人有任何提示/想法/代码可以说明静态变量与常规变量有何不同?
【问题讨论】:
【参考方案1】:在 C 和 Objective-C 中,static 变量是为程序的整个生命周期分配的变量。这与 自动 变量不同,其生命周期存在于单个函数调用中;以及动态分配的变量,如对象,不再使用时可以从内存中释放。更简单地说,静态变量的值在所有函数/方法调用中都保持不变。当在函数外部声明时,静态变量对声明它的文件中的所有内容都是可见的;在函数或方法中声明时,它仅在该函数或方法中可见,但在调用之间保留该值。
假设你有这个:
int f(void)
int i = 5;
i += 10;
return i;
每次调用f()
都会返回值15
。
现在说你有这个:
int g(void)
static int i = 5;
i += 10;
return i;
第一次调用g()
,将返回值15
。第二次,25
将被返回,因为i
保持其值15
,然后自增10
。第三次调用,35
将被返回。以此类推。
在 Objective-C 类的上下文中,静态变量通常用于模仿 类变量,因为 Objective-C 没有类变量(其他语言,如 Java,有)。例如,假设您想延迟初始化一个对象,并且只返回该对象。你可能会看到:
static MyObject *obj = nil;
@implementation MyObject
+ (id)sharedObject
if (obj == nil) obj = [[MyObject alloc] init];
return obj;
@end
obj
将在第一次调用classObject
时被初始化; classObject
的后续调用将返回相同的对象。您可以通过记录对象的地址来检查这一点:
NSLog(@"obj is at %p", [MyObject sharedObject]);
NSLog(@"obj is at %p", [MyObject sharedObject]); // Will print the same address both times
此外,obj
将对MyObject
中的所有方法可见。
这种技术也用于在 Objective-C 中实现单例类。
【讨论】:
很好的解释——尽管命名约定似乎是倒退的! :-) 我的意思是:STATIC这个词的意思是不变的东西,但它是静态变量——从你的“int f(void)”与“int g(void)”的例子来看——是一个它的价值似乎在不断变化——它根本不是一成不变的! 想一想,为什么叫“静态”呢?什么是静态的? 没问题。请注意,您可能还想更改 NSLog 部分。此外,在单例模式中,我会将static MyObject *obj = nil;
放在sharedObject
中。因为它可能是您访问obj
的唯一地方。
来自 Java,具有静态 int i = 5 的语法;在一个方法里面总是让我失望。我一直认为方法内部的赋值是为 i 赋值一个新值 5。
另一个注意事项:如果变量在头文件中被定义为静态,那么每个包含头文件的实现文件 (.m) 都会获得它自己的该变量的副本。【参考方案2】:
static 的工作方式与 C 中的差不多。
它只能初始化一个变量一次。
在@implementation
block 上方的文件中声明一个静态变量将仅适用于整个文件。
【讨论】:
【参考方案3】:“静态”更多地是指变量的属性(谁在哪里)而不仅仅是值。与其他语言不同的是,它专门指代值。
粘性这就像将 var 固定到特定位置,无论是在函数内部还是在实现中。
私人它具有与“私有”变量相似的属性,因为它对兄弟姐妹或父母不可见,但孩子可以访问。
优雅这是一个带有默认值的声明。就像在其他语言中,您在类中定义变量并分配它们的“默认”值:
private int myNumber = 3;
这为我们提供了函数内的“类类”变量。声明一次,然后当函数操作该值时,该值将被保留。下次调用该函数时,该值将与上一个“循环”之后的值相同,就像您希望类变量的值在操作后保持不变一样。
【讨论】:
以上是关于Objective-C 中的静态变量——它们有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章