基础

成员变量、实例变量、属性变量 、全局变量、局部变量详解

2018-03-29  本文已影响50人  54番茄

成员变量

是用于类的内部,无需与外界接触的变量。成员变量默认是protected,因为成员变量不会生成set、get方法,所以无法和外界接触,从下面代码可以看出来,成员变量是定义在{ }中的变量.成员变量存储在堆中

实例变量

如果变量的数据类型是一个类,就如:UIButton * button,Person * person;那么称这个变量为实例变量,实例是针对类而言,实例是指类的声明。所以实例变量也是成员变量的一种特殊情况,实例变量也是类内部使用的,无需与外部接触的变量,这个也就是所谓的类私有变量。

属性变量

是用于与其他对象交互的变量。 属性变量的好处就是允许让其他对象访问到该变量(因为属性创建过程中自动产生了set 和get方法)。 当然,你可以设置只读或者可写等,设置方法也可自定义。 (现在大家似乎都不怎么喜欢用成员变量来定义类的变量, 都喜欢用属性变量来定义类的变量。把需要与外部接触的变量定义在.h文件中,只在本类中使用的变量定义在.m文件中。)

先上了段代码,有代码结合说明,更清晰明了

@interface ViewController :UIViewController 
 {    //成员变量:   
       UIButton * button;    
       NSInteger count;    
       id data;
       Person * person;  //person相对于UIViewController它是其成员变量,又因为person是个类对象,所以也是实例变量
 }
 //属性变量
 @property (nonatomic,strong) NSArray *array2;
 @end

 //定义:在@implementation外定义的变量(在@implementation中定义也是可以但是一般不这么干)
 // 静态全局变量
 static int num=3;
 // 全局变量   (定义没有static的全局变量,命名一定要很独特,才能区分与其他源文件中的全局变量,如果出现跟其他源文件同名的全局变量,则会报错误)
 NSString  * FQDEXIXI= @"xixi";

 @implementation ViewController
 -(void)viewDidLoad {   
      // 局部变量    
     NSArray *array = [[NSArray alloc] initWithObject:@“123”,nil]; 
      // 局部静态变量
      static NSArray *array2 = [[NSArray alloc] initWithObject:@“123”,nil]; 
 }

全局变量

全局变量分为两种:
1、没有static修饰的全局变量,作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。在其他文件如果要用该全局变量,在前面加extern 即可使用了。

要在其他类中访问上面代码声明的  FQDEXIXI  全局变量
extern  NSString  * FQDEXIXI;
NSLog(@"%@",FQDEXIXI);

2、static修饰的也称静态的全局变量,只在该源文件中可用,它的作用域只能是在声明的这个.m文件中,在同一源程序的其它源文件中不能使用它。把全局变量改变为静态变量后是改变了它的作用域,防止重复声明全局变量(就是下面注意要说的一点),限制了它的使用范围。

注意:定义没有static的全局变量,命名一定要很独特,才能区分与其他源文件中的全局变量,如果出现跟其他源文件同名的全局变量,则会报错误,如果用static修饰了同名不报错。

局部变量

1、在函数或代码块中的变量,作用域是从定义的那一行开始,一直到遇到大括号{}或者 return 才结束,如上面代码中的array。局部变量存储在栈里面 系统会自动释放。
2、用static修饰的局部变量成为静态变量后,改变成了静态存储方式。虽然static不可以改变局部变量的作用域,但是可延长局部变量的生命周期,该变量直到整个项目结束的时候才会被销毁。( 例如:tableview的返回cell的代理方法,定义一个标志ID,就是用static去修饰,然后下一个cell就不用再次创建这个标志ID了,可以节省创建的内存消耗)

综上所述可知:
上一篇 下一篇

猜你喜欢

热点阅读