property的属性
- readwrite: 可读可写属性,默认是这个属性,需要生成getter和setter方法。
- readonly: 可读属性,不可写。只会生成getter方法不生成setter方法。
- nonatomic: 非原子属性,线程不安全的,无锁。但更经常用nonatomic,在多线程并发访问时会提高性能。
- atomic: 原子属性,线程安全,有锁。
- copy: 建立一个索引计数为1的对象,在赋值时,使用传入值的一份拷贝。
- retain: 表示持有属性,强引用,当前对象在被其他对象调用的时候引用计数会自动+1,直到引用计数变为0才会被销毁。setter方法中,读取对象先release,再进行retain操作。
- assign: 表示赋值属性,应用于基本数据类型,因为基本数据类型是被分配在栈上的某块内存,栈上的内存是由系统自动分配,所以不会出现野指针。setter方法直接赋值,当对象被销毁后,指针不会自动赋nil,会出现野指针。
- strong: 表示强引用,ARC下使用。当前对象被其他对象调用时引用计数会自动+1,相当于retain。同copy不同的是,strong是两个指针指向同一块内存空间,而copy是拷贝了一份新的空间,两个指针指向不同的内存地址。
- weak: 表示弱引用,ARC下使用。当前对象的生命周期不被是否由其他对象引用限制,它本该什么时候销毁就什么时候被销毁。即使它的引用没断,但是当它的生存周期到了时就会被销毁。当对象被销毁后,指针自动赋nil。常用在delegate、连线上,防止循环引用。
- 在 MRC 中,方法内部的 block 是在栈区的,使用 copy 可以把它放到堆区
- 在 ARC 中写不写都行:对于 block 使用 copy 还是 strong 效果是一样的,但是建议写上 copy,因为这样显示告知调用者“编译器会自动对 block 进行了 copy 操作。
@property的本质是什么?
@property= ivar + getter+ setter; “属性” (property)有两大概念:ivar(实例变量)、getter+setter(存取方法) “属性” (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据。 Objective-C 对象通常会把其所需要的数据保存为各种实例变量。实例变量一般通过“存取方法”(access method)来访问。其中,“获取方法” (getter)用于读取变量值,而“设置方法” (setter)用于写入变量值。
property 默认关键字
- 对应基本数据类型,默认关键字为 atomic, assign, readwrite
- 对应对象类型,默认关键字为 atomic, strong, readwrite
- 有atomic和nonatomic,默认是atomic,acomic也就是线程安全,但是我们一般都用的nonatomic,因为atomic的线程安全开销太大,影响性能,即使需要保证线程安全,我们也可以通过自己的代码控制,而不用atomic。
成员变量成员变量的作用范围:
- @public:在任何地方都能直接访问对象的成员变量
- @private:只能在当前类的对象方法中直接访问,如果子类要访问需要调用父类的get/set方法
- @protected:可以在当前类及其子类对象方法中直接访问(系统默认下是用它来修饰的)
- @package:在同一个包下就可以直接访问,比如说在同一个框架