1.变量类型
变量类型主要分为成员变量和局部变量
1.1成员变量
成员变量是指在类接口部分或类实现部分(@implementation开头)定义的变量,一般用花括号括起来。成员变量的可访问性默认是protected,是受保护的变量,只能在类或者类的继承类中访问,在其他外部类中无法访问。
1.1.1访问方式
成员变量可以通过变量名直接访问,也可以通过self->访问
1.1.2分类
成员变量可以分为实例变量和基本类型变量,实例变量是指由类定义的实例化的变量(不包括基本数据类型,如int、double、float)。基本类型变量是指由基本数据类型修饰的变量。
1.1.3代码实例
{
int basicVar;//基本类型变量
NSString *instanceVar;//实例变量
}
1.2局部变量
定义:在函数内部或者代码块内部声明的变量叫做局部变量,当局部变量超出其作用域,局部变量会被销毁,下一次调用函数或者代码块时,系统又会为局部变量重新分配内存空间。
1.3static关键字
static关键字有两种用法
1.在全局变量前加static,全局变量就被定义成为一个全局静态变量(全局变量和静态全局变量的生命周期是一样的,都是在堆中的静态区,在整个工程执行期间内一直存在)。
作用域:全局变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。 静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。
存储区:全局变量(作者认为是成员变量)和静态全局变量的生命周期是一样的,都是在堆中的静态区,在整个工程执行期间内一直存在。
2.静态局部变量,在方法或者代码块中声明,作用域是当前方法或代码块。
1)存储区:由栈变为静态存储区rw data,生存期为整个源程序,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它;
2)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。
2.访问修饰符
@private 私有的 只能在当前类中实现访问
@protected 受保护的 只能在当前类和子类方法中访问,不写默认为@protected
@package 框架 被修饰的成员变量可以在当前框架中访问
@public 公共的 可以在任意的地方进行访问
代码:
{
@public
int publicIntVar;//加上public之后变成公共的,作用域是任意地方,都可以通过当前类的对象进行访问
NSString *publicVar;
@private
int privateIntVar;
NSString *privateVar;
@package
int packageIntVar;
NSString *packageVar;
}
3.属性
3.1 property
定义:因为成员变量具有可访问性的限制,为了方便访问,所以有了属性变量,属性变量的存在就是允许其他类的对象能够通过当前类的对象访问到属性变量。属性变量可以设置只读或者可读写,可以自定义设置。所以通过属性变量可以方便的实现和其他对象的交互。
访问方式:属性可以通过点语法:self.属性名的方式进行访问,这种方式实际上是访问系统自动生成的getter和setter方法,也可以访问自动生成的成员变量,通过成员变量的名称或者self->的方式进行访问。
代码:
@property (nonatomic) int propertyInt;//整形属性
@property (nonatomic, strong) NSString *name
系统自动生成对应的getter、setter方法
代码:
//getter方法
-(int)propertyInt{
return _propertyInt;
}
//setter方法
-(void)setPropertyInt:(int propertyInt){
_propertyInt = propertyInt;
}
//getter方法
-(int)name{
return _name;
}
//setter方法
-(void)setname:(int name){
_name = name;
}
实现原理:使用@property能够声明一个属性,系统会自动生成一个私有的名为:_属性名的成员变量,如_name,并且系统会自动生成该成员变量的setter和getter方法,属性不是变量,对象类型的属性其实是声明了一个指针,这个指针的地址指向的是自动生成的成员变量,我们在访问的时候实际上访问的是自动生成的成员变量,只不过是通过指针访问的。
3.2 synthesize
提到属性就不得不提@synthesize了,系统默认情况下会为属性生成对应的getter和setter方法,如果我们只重写getter和setter方法其中一个,系统会为我们生成另外一个以及成员变量,如果同时重写了两个,那么编译器不会为我们再生成实例变量,需要手动生成。
语法:
@synthesis 属性名 = 成员变量名
例如
@synthesis name = _name
也可以使用@synthesis来修改属性对应的实例变量名称