类型成员
1. 数据成员:实例变量(对内)、属性(对外)
2. 函数成员:方法等
3. 属性:例如,@property int age;
(实例变量 例如,int age;)
生成属性时:1. 生成一个实例变量 2. 生成实例方法getter 3. 生成实例方法setter
书写表达式的时候,做赋值会被编译器翻译成setter访问器方法,做读值会被翻译成getter访问器方法
推荐使用点表达式
注:类外只能访问属性,不能访问实例变量
//
除了setter,getter以外还可以自定义访问器方法
可以更改属性的名称
更改属性背后的实例变量的名字:@synethesize a=b (把a改成b)
//
可以自定义静态变量 static int _max = 100;
为静态变量提供访问器方法
4. 实例变量
只能在类内访问
同时自定义setter getter两个方法或((readonly)只读属性:只有getter)编译器不会自定义实例变量
5.使用条件
类外一律使用属性
类内优先使用self.访问
特例:初始化器,析构器,自定义访问器方法三种情况需要访问实例变量
6. 生存周期
实例变量:存储在堆上,对于值类型直接嵌入堆,跟随堆的释放而释放;对于引用类型,只有当栈上的指针和堆上作为属性的指针都释放时才会释放
7. 属性的描述特性
(1)默认为读写属性,但加上(readonly)变为只读属性,就不可以再赋值。
(2)多线程特性:默认为原子性(要么彻底执行,要么彻底不执行)
(3)内存管理特性:
A. (strong)强引用属性与(weak)弱引用属性
默认为(strong)强引用,但某些情况下可能出现循环引用(双方互相指认)的问题,使得两个对象不能被释放,ARC产生内存泄漏。因此,加入(weak)弱引用后,ARC不做内存计数,可以阻止循环引用,使得两个对象都能够被成功释放。
B. (copy)拷贝属性
赋值后指向了同一个字符串,会出现连带更改问题。但加入(copy)之后,复制后就会拷贝一份新的内存,让指针指向拷贝出的新内存此时再更改之前的字符串就不会对新拷贝的字符串产生影响。