assign修饰对象类型会怎样?

众所周知,iOS开发中,assign和weak都是弱引用,基础数据类型我们一般都是用assign修饰,而对象一般都是用weak修饰的。那么问题来了,如果用assign修饰对象,会产生什么的后果?

在弄清之前,我们首先要了解一下内存管理机制。我们初始化一个对象如下:

Objct *obc =[ [Objct alloc]init];

@property(assign)int a;

@property(assign) Objct  *obc;

对于以上 Objct 对象内存分配控件存在于堆上,而地址指针obc存在于栈上。对于a,内存空间存在于栈上面,都知道存在栈上面的由系统统一管理,不需要程序员去管理,而存在于堆上的空间需要程序员去手动管理的,当我们将对象销毁的时候,对象的内存空间释放,存在于栈指针也会nil,就不会产生野指针了。回到上面问题,如果用assign修饰一个对象后,当对象被释放后,存在于栈上的指针还是存在的,假如此时使用指针,它就是一个野指针了,就容易造成程序崩溃,如果是用weak修饰的对象,则不会产生上面的情况,因为对象销毁的时候,系统会将指针置nil,也就不会产生野指针了。

综上所述,修饰对象用weak,基础数据类型用assign。

posted @ 2019-06-10 17:28  黄增松  阅读(1178)  评论(0编辑  收藏  举报