属性变量,实例变量,全局变量

对于属性,我们第一时间就会想到 self.name,@property,如:

@property(nonatomic,copy) NSString *name;

这里的name 被我们称为属性变量,或是成员变量。
对于这种:

@interface Person() {
NSString *_shortname;
}

我们称为实例变量。
区别:成员变量 = 实例变量 + 存取方法(setter,getter)。
比如:当我们使用self.name = @"name" 的时候实际上是使用了namesetter方法,对实例变量_name进行了赋值。

 -(void)setName:(NSString *)name {
 _name = name;
}

当我们读取self.name的值的时候,实际上是通过getter方法获取_name的值。

-(NSString *)name {
return _name;
}

注意:1.如果你需要同时重写namesettergetter方法的时候,你需要使用

@synthesize name = _name;

2.在init方法中不要使用self.来调用属性。self.这种方式会调用存取方法,需要一个已经完全初始化好的对象来进行操作,而在init方法中,存在着self没有完全初始化好的的情况,可能会出现一些莫名其妙的问题。
局部变量就不再赘述,对于全局变量,首先要说明_name这种不叫全局变量!!!全局变量的定义一般是这个样子的:

NSString * Phone = @"138xxxxxxxxxx";

需要注意的一点是,当我们使用const声明全局变量之后,表示该值是不可修改的。

NSString * const Phone = @"138xxxxxxxxxx";

对于static来说,static 是限定该变量的作用范围只在定义该变量的编译单元中有效,一般都是在.m文件中使用static定义,表示只在当前类中可以使用。当然,如果是暴露在.h文件中,只要导入该类的头文件自然是可以使用Phone的。

static NSString * const Phone = @"138xxxxxxxxxx";

如果不加static 就表示该变量可以在其它类中使用,只需要在使用前在该类中使用extern 引用该变量即可。
关于const位置的问题 参考 http://www.jianshu.com/p/f83335e036b5

注意:如果在extern引用的时候没有添加const关键字,即便是在定义时声明该值不可变,该值仍然是可以被改变的。

extern NSString *Phone;
Phone = @"xxxxxxxxxxx138";
NSLog(@"%@", Phone);
 
const.png


作者:墨笑白
链接:https://www.jianshu.com/p/a5e5f487ef0e
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
原文地址:https://www.cnblogs.com/huangzs/p/9394807.html