浅谈——名词strong、weak、assign、copy,并比较不同
- strong 表示指向并拥有该对象。其修饰的对象引用计数会增加1。该对象只要引用计数不为0则不会被销毁。当然强行设置为nil可以销毁她
- weak 表示指向但不拥有该对象。其修饰的对象引用计数不会增加。无需手动设置,该对象会自行在内存中销毁。
- assign 主要用于修饰基本数据类型,如NSInteger和CGFloat,这些数值主要存在于栈中。
- copy copy与strong类似。不同之处是strong的复制是多个指针指向同一个地址,而copy的复制每次会在内存中拷贝一份对象,指针指向不同的地址。copy一般用在修饰有可变对应类型的不可变对象上,如NSString、NSArray、NSDictionary。
- weak与assign weak一般用来修饰对象,assign一般用来修饰基本数据类型。原因是assign修饰的对象被释放后,指针的地址依然存在,造成野指针,在堆上容易造成崩溃,而在栈上的内存系统会自动处理,不会造成野指针。
- Objective-C中,基本数据类型的默认关键字是atomic、readwrite、assign;普通属性的默认关键字是atomic、readwrite、strong。
浅谈—— readwrite、readonly
- readwrite (默认值):表示其同时拥有getter和setter方法
- readonly:只读操作,其只有getter方法,没有setter方法
注:如果某个实例只允许被外部读取,而不能写入操作,同时在类实现文件当中可以写入的话,可以在头文件中声明属性为只读的,在实现文件中设置其为可读写的属性,写法如下:
//头文件中声明为:
@property(nonatomic,readonly,copy) NSString *stringA;
//实现文件中声明为:
@property(nonatomic,readwrite,copy) NSString *stringA;
浅谈——__weak、__block
- __weak 和weak基本相同,前者用于修饰变量,后者用于修饰属性。代码中__weak主要是为防止Block中的循环引用。
- __blcok也用于修饰变量,他是引用修饰,所以其修饰的值是动态变化的,即可以被重新赋值的。__block 用于修饰某些Block内部将要修饰的外部变量。
- __weak 和 __block的使用场景几乎和Block息息相关。而所谓Block,就是objective-c对于闭包的实现,闭包就是没有名字的函数,或者理解为指向函数的指针。
浅谈——atomic、nonatomic
- atomic 修饰的对象会保证setter和getter的完整性,任何线程对其访问都可以得到一个完整的初始化的对象,欣慰要保证操作完成,所以速度慢,它比nonatomic安全,但并不是绝对的线程安全,例如多个线程同时调用set和get就会导致获得的对象值不一样。想要绝对的线程安全,就要用synchronized。
- nonatomic修饰的对象不保证setter和getter的完整性,所以多个线程访问,它可能回返回未初始化的对象。正因为如此,它比atomic快,但线程也是不安全的。