iSO weak和assign的区别

Posted 1018475062

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iSO weak和assign的区别相关的知识,希望对你有一定的参考价值。

一、区别

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

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

二、相似

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

三、总结

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

以上是关于iSO weak和assign的区别的主要内容,如果未能解决你的问题,请参考以下文章

assign和weak的区别

strong ,weak,copy关键字使用,及weak跟assign区别

iOS中assign,copy,retain之间的区别以及weak和strong的区别

区别assign VS weak,__block VS __weak

iOS 开发 property,strong,weak,retain,assign,copy,nomatic 的区别及使用

ios OC 关键字 copy,strong,weak,assign的区别