我看过一些讨论什么是静态变量的帖子,我想我明白了 - 但我很想快速编写(或找到)一个同时使用常规变量和静态变量的程序,并查看他们如何/何时以不同的方式运作。一些快速的脏代码,可能是两个 int vars 和几个 NSLog 跟踪语句,只是为了看看它们有什么不同。
有人有任何提示/想法/代码可以说明静态变量与常规变量有何不同?
我看过一些讨论什么是静态变量的帖子,我想我明白了 - 但我很想快速编写(或找到)一个同时使用常规变量和静态变量的程序,并查看他们如何/何时以不同的方式运作。一些快速的脏代码,可能是两个 int vars 和几个 NSLog 跟踪语句,只是为了看看它们有什么不同。
有人有任何提示/想法/代码可以说明静态变量与常规变量有何不同?
在 C 和 Objective-C 中,静态变量是为程序的整个生命周期分配的变量。这与自动变量相反,自动变量的生命周期存在于单个函数调用中;和动态分配的变量,如对象,不再使用时可以从内存中释放。更简单地说,静态变量的值在所有函数/方法调用中都保持不变。当在函数外部声明时,静态变量对声明它的文件中的所有内容都是可见的;在函数或方法内声明时,它仅在该函数或方法内可见,但在调用之间保留该值。
假设你有这个:
int f(void)
{
int i = 5;
i += 10;
return i;
}
每次调用f()
都会返回 value 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 的工作方式与 C 中的大部分情况类似。
它只能初始化一个变量一次。
在块上方的文件中声明变量静态@implementation
将仅适用于整个文件。
“静态”更多地是指变量的属性(谁在哪里)而不仅仅是值。与其他语言不同,它专门指的是值。
这就像将 var 固定到特定位置,无论是在函数内部还是在实现中。
它具有与“私有”变量相似的属性,因为它对兄弟姐妹或父母不可见,但孩子可以访问。
它是一个具有默认值的声明。就像在其他语言中您在类中定义变量并分配它们的“默认”值一样:
private int myNumber = 3;
这为我们提供了函数内的“类类”变量。声明它们一次,然后当函数操作值时,值将被保留。下次调用该函数时,该值将与前一个“循环”之后的值相同,就像您期望类变量的值在操作后保持不变一样。