iOS中 assign 和 weak 修饰符的区别

原创 2016年06月02日 10:07:20

一、区别

assign 与 weak,它们都是弱引用声明类型,最大的区别在那呢?

如果用 weak 声明的变量在栈中就会自动清空,赋值为 nil。

如果用 assign 声明的变量在栈中可能不会自动赋值为 nil,就会造成野指针错误!

二、实例

他们常用在基本类型属性,比如 BOOL,int 等,还有就是 delegate。

在使用 delegate 时,需要注意,非 ARC 时是使用 assign,但到了 ARC 时代,都建议使用 weak,这样更安全。

不管是在非 ARC 还是 ARC,使用 assign 时,都需要注意释放:


                        /**
                         delegate, 见 NTESAdManagerDelegate
                         */
                        @property(nonatomic, assign) id<NTESAdManagerDelegate> delegate;
                    

如果你写的 library 比较早,那时还是非 ARC 的,你的 delegate 设成 assign property,这样不会造成 circular reference。

当别人使用你的 library 的时候,记得在你自己 dealloc 的时候,把 delegate 设成 nil,以避免 crash 的事情发生。

这在非 ARC 模式下是比较自然的,都会这么去做。


                        // 当 myViewController 的 retain count  变为0,则会 dealloc.
                        // 同时在 dealloc 中,也一并把 myClass release,则 myClass 也跟着被 release.
                        // 非 ARC
                        -(void)dealloc
                        {
                            myClass.delegate = nil;
                            [myClass release];
                            [super dealloc];
                        }
                    

但在 ARC 模式下,使用方就不会有 dealloc 处理的习惯了


                        // ARC
                        -(void)dealloc
                        {
                            [myClass setDelegate:nil];
                        }
                    

如果在 ARC 下,没有做这个逻辑的话,当页面销毁的时候,很可能出现 delegate 对象无效,导致程序 crash。

所以,在我们使用网上下载的开源库或者时间比较久的代码时,记得检查 delegate 的修饰符,如果是 assign 的需要及时修改为 weak。


                        /**
                         delegate, 见 NTESAdManagerDelegate
                         */
                        @property(nonatomic, weak) id delegate;参考链接: 
1. http://stefan321.iteye.com/blog/1593869
2. http://lizhuang.iteye.com/blog/1989337
3. http://94it.net/a/jingxuanboke/2014/1218/427909.html

iOS中assign、retain、copy、weak、strong的区别以及nonatomic的含义

声明@property 属性时,括号中assign、retain、copy、weak、strong以及nonatomic到底是干啥的...

IOS开发中ARC下的assign和weak区别

在ARC中的assign和weak可以说非常相像,导致有很多人误以为他们是一摸一样的,在任何时候都可以划等价,但事实却不是这样。在群里,有人问,id类型的delegate属性到底是用assign还是w...

iOS中assign和weak的区别

一、区别 assign与weak,它们都是弱引用声明类型,最大的区别在那呢? 如果用weak声明的变量在栈中就会自动清空,赋值为nil。 如果用assign声明的变量在栈中可...

iOS中 property中的属性strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解

iOS5中加入了新知识,就是ARC,因为习惯了自己管理内存。但是学习还是很有必要的。 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟...

iOS开发-assign、retain、copy、strong、weak的区别

对于初学的开发者,对于assign、retain、copy、strong、weak的用法及意义可能不是很明白,我对于这个问题也研究了很久,在篇博文,巧巧代码,让我们来瞧瞧吧! 先定义一个Student...

iOS开发中ARC下的assign和weak区别

我个人理解就是:weak比assign多了一个功能就是当属性所指向的对象消失的时候(也就是内存引用计数为0)会自动赋值为nil,这样再向weak修饰的属性发送消息就不会导致野指针操作crash。可能不...

iOS小明开发笔记(二十) (retain、strong、weak、assign区别)

1、假设你用malloc分配了一块内存,并且把它的地址赋值给了指针1,后来你希望指针b,也可以共享这块内存,于是你又把a赋值给了b(assign)。此时a和b指向同一块内存,请问,当a不再需要这块内存...

iOS开发-retain/assign/strong/weak/copy/mutablecopy/autorelease区别

readwrite:是可读可写特性,需要生成getter和setter方法; readonly是之都特性,只会生成getter方法,不会生成setter方法,不希望属性在类外改变时候使用; all...

iOS海哥开发笔记 (海哥原创,retain、strong、weak、assign区别)

感觉做iOS开发这么久了,跟同事大哥们学到了不少东西,在此感谢李群,余灵大哥,在任务艰巨的时候,也总是帮助我修改bug,解决逻辑问题,在此感谢心地善良的你们,向你们学习。在学习之中想为以后的同仁们建立...
  • horisea
  • horisea
  • 2016年02月23日 12:26
  • 381

iOS中assign,copy,retain之间的区别以及weak和strong的区别,NSString什么时候用copy,什么时候用strong

@property (nonatomic, assign) NSString *title;  什么是assign,copy,retain之间的区别?  assign: 简单赋值,不更改索...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS中 assign 和 weak 修饰符的区别
举报原因:
原因补充:

(最多只允许输入30个字)