@property与@synthesize配对使用(如今可以在.m中省略@synthesize声明,自动完成@synthesize功能,重写getter与setter或者在协议中声明的属性除外)
@property:
- 在.h中声明成员变量编译器自动添加上setter,getter方法使其成员变量称为属性
@synthesize:
- 在.m中声明,编译器自动添加上该成员变量setter,getter方法
格式:
- 声明property的语法为:@property (参数1,参数2,参数3) 类型 名字;
- 如:
- @property(nonatomic, strong) UIWindow *window;
- 参数分3类:
- 1.读写属性: (readwrite/readonly)
- 默认readwrite
- 2.setter语意:(assign/retain/copy)
- 默认assign
- 3.原子性: (atomic/nonatomic)
- 默认atomic
- 1.读写属性: (readwrite/readonly)
- 参数意义:
- readwrite:
- 产生setter\getter方法
- readonly:
- 只产生简单的getter,没有setter。
- assign:
- 默认类型,setter方法直接赋值,而不进行retain操作
- 一般Scalar Varible用该属性声明,比如,int, BOOL
- retain:
- setter方法对参数进行release旧值,再retain新值。
- copy:
- setter方法进行Copy操作,与retain一样
- nonatomic:
- 不是多线程操作使用nonatomic(多线程下可以通过在getter/setter方法加锁实现兼容多线程操作)
- 多线程下选用atomic(多线程下也不建议使用atomic,atomic并不能保证数据准确性,以及该类型会降低性能,应通过GCD实现保证线程安全)
- 所有者属性:
- 所有权有关系的属性,关键字间的对应关系:
- strong __strong 有
- weak __weak 无
- unsafe_unretained __unsafe_unretained 无
- copy __strong 有
- assign __unsafe_unretained 无
- retain __strong 有
- /*
- delegate 和 Outlet 应该用 weak 属性来声明
- block应用copy属性来声明
- */
- 所有权有关系的属性,关键字间的对应关系:
- readwrite:
@synthesize和@dynamic区别:
- 在声明property属性后,有2种实现选择:
- @synthesize
- 编译器期间,让编译器自动生成getter/setter方法。
- 当有自定义的存或取方法时,自定义会屏蔽自动生成该方法
- @dynamic
- 告诉编译器,不自动生成getter/setter方法,避免编译期间产生警告,然后由自己实现存取方法
- 或存取方法在运行时动态创建绑定
- @synthesize