属性是Objective-C 2.0 引入的,提供了一种轻松地为类声明实例变量的方法,并让编译器自动生成存取方法。另外,属性还提供了一种通过限定符声明所有权的方式(无论是否使用ARC),编译器将根据指定的限定符生成正确的代码。
属性是在类的接口中声明的。属性可在头文件(.h)中声明,这样的属性在外部可见;也可以在(.m)文件中声明,这样的属性只在当前的类的实例中可见。 编译器将根据指定的限定修饰符(也可称之为特性)创建实例变量和标准的存取方法。 有三种限定符可用于属性修饰。
//第一种(原子性):nonatomic/atomic(默认)命令编译器加锁,让属性能够同时被多个线程安全的访问,但是系统开销过大。如果不需要这种加锁机制,可使用限定符nonatomic,让编译器不生成加锁代码。在这种情况下,将不能从多个线程安全地访问属性。 //第二种(可写性):readwrite(默认,让编译器为实例变量生成取方法和存方法)/readonly(只生成取方法) //第三种(内存管理,只针对存方法):具体如下 #assign(默认):赋值;有用assign特性的属性,其存方法只会将传入的参数复值给实例变量;一般是非对象属性(基本数据类型,id类型), #retain:存方法会先保留或者复制传入的参数,然后再复制给实例变量; #copy:重新开辟内存空间,防止间接被改变;多用于属性类型是可修改的子类,如NSArray,NSString,block; //下面时iOS5 ARC(编译器特性)时新加的关键字 #strong: 与retain类似,只要有strong指向的内存就不会被释放。 #weak: 当weak指针指向的对象没有强指针指向时,系统自动设为nil,对象被释放。相对于unsafe_unretained是安全的。 #unsafe_unretained: 见文思意 unSafe & unRetained 既不安全也不回引用计数加一。当所指对象没有强指针指向时,会造成野指针错误,造成程序崩溃。 区别:copy retain:需要注意的几个问题: -为什么给xib&storyBoard拖拽空间默认是weak?因为xib&storyBoard中的Controller->View->UIView(->表示强饮用);self.view addSubView:这种方法也会是strong效果 -懒加载处理界面空间也要使用strong强指针
如有不妥之处,万望不吝赐教(QQ:372160694) (未完待续)