黑马程序员技术交流社区

标题: static静态变量 [打印本页]

作者: Meniny    时间: 2014-8-24 20:57
标题: static静态变量
程序执行到方法内定义的变量时,系统会在栈上分配空间,方法在栈上分配的空间在此方法执行结束是会释放,但有时候我们却想让此变量的值保存到下一次调用时,该怎么办呢?能想到的第一个方法可能就是全局变量了,但是全局变量也有许多缺点,例如其作用域会导致变量的值不仅仅受控于此方法。鉴于这样的情况,OC为我们提供了static关键字,static关键字所修饰的变量叫做静态变量。
基于面向对象的角度,当我们需要一个数据对象为整个类(而非某个对象)服务而不破坏封装性时,就可以使用static关键字,这样的静态变量有这样几个优点:
(1)对于多个对象来说,静态变量是所有对象公有的,所以只需要存储一份即可,这样就节省了内存开销。
(2)静态变量的值对于每个对象都一样,但它的值是可以更新的。
(3)当某一对象对静态变量的值进行一次更新,所有对象就都可以访问新的值,提高了效率。
举个栗子:
Test.h:
  1. // Test.h
  2. #import <Foundation/Foundation.h>
  3. @interface Test:NSObject{
  4. }
  5. + (int)staticIntB;
  6. @end
复制代码


Test.m:
  1. // Test.m
  2. #import "Test.h"
  3. int intA = 10;
  4. static int intB = 10;
  5. @implementation Test
  6. + (int)staticIntB
  7. {
  8.         intB += 1;
  9.         return IntB;
  10. }
  11. @end
复制代码


Main.m:
  1. // Main.m
  2. #import <Foundaton/Foundation.h>
  3. #import "Test.h"
  4. int main()
  5. {
  6.         NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]l
  7.         NSLog(@"%i",[Test staticIntB]);
  8.         NSLog(@"%i",[Test staticIntB]);
  9.         [pool drain];
  10.         return 0;
  11. }
复制代码


Console:
  1. 11
  2. 20
复制代码


可以看出,静态变量的值是可以更新的,只要对其值更新一次,则任何访问改变量的对象都将获得新的值。
除此之外,实例方法也可以使用静态变量。
作者: 庄得超    时间: 2014-8-24 21:38
其实,我觉得这样解释static静态变量的特点,会更易懂些。
作者: 庄得超    时间: 2014-8-24 21:40
static变量是在程序加载的时候就为之分配内存的,一直到程序结束,而不像普通变量那样函数执行一次分配一次。
作者: 王绍明    时间: 2014-8-25 08:43
STATIC只是一个声明周期 控制循环生命周期




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2