程序执行到方法内定义的变量时,系统会在栈上分配空间,方法在栈上分配的空间在此方法执行结束是会释放,但有时候我们却想让此变量的值保存到下一次调用时,该怎么办呢?能想到的第一个方法可能就是全局变量了,但是全局变量也有许多缺点,例如其作用域会导致变量的值不仅仅受控于此方法。鉴于这样的情况,OC为我们提供了static关键字,static关键字所修饰的变量叫做静态变量。
基于面向对象的角度,当我们需要一个数据对象为整个类(而非某个对象)服务而不破坏封装性时,就可以使用static关键字,这样的静态变量有这样几个优点:
(1)对于多个对象来说,静态变量是所有对象公有的,所以只需要存储一份即可,这样就节省了内存开销。
(2)静态变量的值对于每个对象都一样,但它的值是可以更新的。
(3)当某一对象对静态变量的值进行一次更新,所有对象就都可以访问新的值,提高了效率。
举个栗子:
Test.h:
- // Test.h
- #import <Foundation/Foundation.h>
- @interface Test:NSObject{
- }
- + (int)staticIntB;
- @end
复制代码
Test.m:
- // Test.m
- #import "Test.h"
- int intA = 10;
- static int intB = 10;
- @implementation Test
- + (int)staticIntB
- {
- intB += 1;
- return IntB;
- }
- @end
复制代码
Main.m:
- // Main.m
- #import <Foundaton/Foundation.h>
- #import "Test.h"
- int main()
- {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]l
- NSLog(@"%i",[Test staticIntB]);
- NSLog(@"%i",[Test staticIntB]);
- [pool drain];
- return 0;
- }
复制代码
Console:
可以看出,静态变量的值是可以更新的,只要对其值更新一次,则任何访问改变量的对象都将获得新的值。
除此之外,实例方法也可以使用静态变量。 |