__unsafe_unretained 和 __weak 都不会持有指针所指向的对象,但是在指向对象释放后,__unsafe_unretained 不会自动置空指针,会形成野指针,所以需要用户手动去置空,使用__weak 会自动置空指针。但是,如果访问__weak 修饰的属性时,runtime底层会调用objc_loadWeak() 和 objc_storeWeak来完成,这会带来很大的开销,所以避免使用__weak 属性。
__unsafe_unretained 和 __weak 都不会持有指针所指向的对象,但是在指向对象释放后,__unsafe_unretained 不会自动置空指针,会形成野指针,所以需要用户手动去置空,使用__weak 会自动置空指针。但是,如果访问__weak 修饰的属性时,runtime底层会调用objc_loadWeak() 和 objc_storeWeak来完成,这会带来很大的开销,所以避免使用__weak 属性。