对于属性,我们第一时间就会想到 self.name
,@property
,如:
@property(nonatomic,copy) NSString *name;
这里的name
被我们称为属性变量,或是成员变量。
对于这种:
@interface Person() {
NSString *_shortname;
}
我们称为实例变量。
区别:成员变量 = 实例变量 + 存取方法(setter,getter)。
比如:当我们使用self.name = @"name"
的时候实际上是使用了name
的setter
方法,对实例变量_name
进行了赋值。
-(void)setName:(NSString *)name {
_name = name;
}
当我们读取self.name
的值的时候,实际上是通过getter
方法获取_name
的值。
-(NSString *)name {
return _name;
}
注意:1.如果你需要同时重写name
的setter
和getter
方法的时候,你需要使用
@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";
注意:如果在extern
引用的时候没有添加const
关键字,即便是在定义时声明该值不可变,该值仍然是可以被改变的。
extern NSString *Phone;
Phone = @"xxxxxxxxxxx138";
NSLog(@"%@", Phone);
const.png