众所周知,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。
网友评论