招聘靠谱程序员系列:2 什么情况使用 weak 关键字,相比 assign 有什么不同?

版权声明:书写博客,不为传道受业,只为更好的梳理更好的记忆,欢迎转载与分享,更多博客请访问:http://blog.csdn.net/myinclude 和 http://www.jianshu.com/u/b20be2dcb0c3 https://blog.csdn.net/myinclude/article/details/84927804

答:

1、什么情况下使用weak:

a、在ARC中修饰代理
b、使用@IBOutlet连接控件
c、当block会造成循环引用

2、与assign的不同

assign可以用于非对象类型,而weak必须用于对象类型

参考资料:

1、区别
  • a、修饰变量类型的区别
    weak 只可以修饰对象。如果修饰基本数据类型,编译器会报错-“Property with ‘weak’ attribute must be of object type”。
    assign 可修饰对象,和基本数据类型。当需要修饰对象类型时,MRC时代使用unsafe_unretained。当然,unsafe_unretained也可能产生野指针,所以它名字是"unsafe_”。

  • b、是否产生野指针的区别
    weak 不会产生野指针问题。因为weak修饰的对象释放后(引用计数器值为0),指针会自动被置nil,之后再向该对象发消息也不会崩溃。 weak是安全的。
    assign 如果修饰对象,会产生野指针问题;如果修饰基本数据类型则是安全的。修饰的对象释放后,指针不会自动被置空,此时向对象发消息会崩溃。

2、相似

都可以修饰对象类型,但是assign修饰对象会存在问题。

3、总结
  • assign 适用于基本数据类型如int,float,struct等值类型,不适用于引用类型。因为值类型会被放入栈中,遵循先进后出原则,由系统负责管理栈内存。而引用类型会被放入堆中,需要我们自己手动管理内存或通过ARC管理。
  • weak 适用于delegate和block等引用类型,不会导致野指针问题,也不会循环引用,非常安全。

猜你喜欢

转载自blog.csdn.net/myinclude/article/details/84927804