A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Meniny 中级黑马   /  2014-8-24 20:57  /  843 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

程序执行到方法内定义的变量时,系统会在栈上分配空间,方法在栈上分配的空间在此方法执行结束是会释放,但有时候我们却想让此变量的值保存到下一次调用时,该怎么办呢?能想到的第一个方法可能就是全局变量了,但是全局变量也有许多缺点,例如其作用域会导致变量的值不仅仅受控于此方法。鉴于这样的情况,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
复制代码


可以看出,静态变量的值是可以更新的,只要对其值更新一次,则任何访问改变量的对象都将获得新的值。
除此之外,实例方法也可以使用静态变量。

3 个回复

倒序浏览
其实,我觉得这样解释static静态变量的特点,会更易懂些。
回复 使用道具 举报
static变量是在程序加载的时候就为之分配内存的,一直到程序结束,而不像普通变量那样函数执行一次分配一次。
回复 使用道具 举报
STATIC只是一个声明周期 控制循环生命周期
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马