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中 property中的属性strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用详解

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

iOS中assign和weak修饰符的区别

assign与weak,它们都是弱引用声明类型,最大的区别在那呢? 如果用weak声明的变量在栈中就会自动清空,赋值为nil。 如果用assign声明的变量在栈中可能不会自动赋值为nil,就会造成野指...
  • skylin19840101
  • skylin19840101
  • 2015-03-09 16:46:17
  • 4777

iOS 中strong,weak,copy,assign区别

1:ARC环境下,strong代替retain.weak代替assign 2:weak的作用:在ARC环境下,,所有指向这个对象的weak指针都将被置为nil。这个T特性很有用,相信很多开发者都被指...
  • longshen_csdn
  • longshen_csdn
  • 2015-12-14 19:24:15
  • 1252

iOS中assign与weak,retain与strong的区别

以前在没有ARC的时候我们使用assign与retain来修饰属性,后来引入了更安全的weak和strong来修饰属性assign与weak 两者都是弱引用,assign通常用于普通类型属性(如in...
  • u014041012
  • u014041012
  • 2017-02-26 11:40:03
  • 1639

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

@property (nonatomic, assign) NSString *title;  什么是assign,copy,retain之间的区别?  assign: 简单赋值,不更改索...
  • getchance
  • getchance
  • 2014-12-28 13:26:59
  • 23287

关于property的各个修饰符(strong,weak,retain,assign,copy等等)

下面对property的修饰符作一次总结,上网查了不少资料,后面附上参考的资料链接,多谢他们的帮助。1、atomic 和 nonatomicatomic是默认的属性,表示对对象的操作属于原子操作,主要...
  • shenzhonglaoxu
  • shenzhonglaoxu
  • 2015-08-20 16:23:01
  • 1154

iOS中delegate代理对象使用weak和assign哪个

之前不停应用的是assign,本日调试一段代码的时间,发明顺序会crash失落,报错EXC_BAD_ACCESS 经由一番研讨,发明若是应用 @property (nonatomic, assign,...
  • yishengzhiai005
  • yishengzhiai005
  • 2016-03-24 21:58:33
  • 2866

assign weak retain strong copy关键字的区别

在iOS开发中定义@property属性时,经常用到assign、weak、retain、strong、copy等关键字。我们经常会考虑在何时应该使用哪个关键字,尤其是在面试的时候,经常会被问到这些关...
  • liushuo19920327
  • liushuo19920327
  • 2016-05-21 00:11:16
  • 4109

__weak与__block修饰符到底有什么区别

API Reference对__block变量修饰符有如下几处解释://A powerful feature of blocks is that they can modify variables ...
  • abc649395594
  • abc649395594
  • 2015-05-04 09:47:09
  • 8757

iOS 中利用strong,copy,assign,weak修饰变量的异同点

ARC中以下内容摘自博客http://blog.csdn.net/liushuo19920327/article/details/51465318在iOS开发中定义@property属性时,经常用到a...
  • haha_hello
  • haha_hello
  • 2017-03-27 23:48:10
  • 792
收藏助手
不良信息举报
您举报文章:iOS中 assign 和 weak 修饰符的区别
举报原因:
原因补充:

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