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

成员变量

是用于类的内部,无需与外界接触的变量。成员变量默认是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了,可以节省创建的内存消耗)

综上所述可知:
  • static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

  • static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;

  • static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

你可能感兴趣的:(成员变量、实例变量、属性变量 、全局变量、局部变量详解)