3.iOS属性 strong、weak、assign、copy、atomic、nonatomic
strong:
指向并持有该对象,引用计数会加1。可以通过将变量强制赋值 nil 来进行销毁,ARC中引用计数为0自动销毁。@property 对象类型默认属性。
weak:
指向但是并不持有该对象,引用计数不会加1。在 Runtime 中对该属性进行了内存管理操作。
assign:
assign主要用于修饰基本数据类型,例如NSInteger,CGFloat,存储在栈中,不需要手动管理内存。@property 数据类型默认属性。
copy:
copy关键字和 strong类似,copy 多用于修饰有可变类型的不可变对象上 NSString,NSArray,NSDictionary上。
atomic:
这个属性是为了保证在多线程的情况下,编译器会自动生成一些互斥加锁的代码,避免该变量的读写不同步的问题。@property 默认属性
nonatomic :
如果该对象无需考虑多线程的情况,这个属性会让编译器少生成一些互斥代码,可以提高效率。
strong和weak的区别?
weak用来解决循环引用的问题,底层实现比strong更为复杂,使用较多或不当会浪费cpu资源。
strong和copy的区别?
一般在定义非mutable对象时使用copy。strong本质是retain,赋值时copy另一对象的指针。copy在非mutable时拷贝了参数内容,并没有生成新的对象。而在copy在mutable时生成新的不可变对象,而想要生成新的可变对象时,需要用mutablecopy进行深拷贝。
__weak 和 __unsafe_unretain 的区别?
__unsafe_unretain 在指向的内存地址销毁后,指针本身并不会自动销毁,这也就造成了野指针,之后容易造成 Crash。__weak 在指向的内存销毁后,可以将指针变量置为 nil,这样更加安全。
__weak 修饰的变量在地址被释放后,为何被置为 nil?
在 Runtime 中专门维护了一个用于存储 weak指针变量的 Hash 表。这个表 key 是 weak指针所指向的内存地址,value 是指向这个内存地址的所有 weak指针,实际上是一个数组。释放时根据对象地址获取所有 weak指针 地址的数组,然后遍历这个数组把其中的数据设为 nil,最后把这个 对象 从weak表 中删除。
使用atomic一定是线程安全的吗?
atomic可以保证setter和getter存取的线程安全并不保证整个对象是线程安全的。
比如,声明一个NSMutableArray的原子属性array,此时self.array和self.array = otherArray都是线程安全的。但是,使用[self.array objectAtIndex:index]就不是线程安全的,需要用锁来保证线程安全性。

浙公网安备 33010602011771号