iOSOCiOS记录篇

@property 关键字的区别详解:assign 与weak、

2016-03-01  本文已影响3661人  久林的技术随笔

最近有同学问我关于属性@property()的关键字assign,weak,strong,copy区别,这里总结一下,供大家参考。修饰代理等对象使用weak,修饰NSString、block使用copy,但很少思考为什么?这篇文章将会给大家揭开这层面纱。


1.assign 与weak区别

  • assign其实也可以用来修饰对象。那么我们为什么不用它修饰对象呢?因为被assign修饰的对象(一般编译的时候会产生警告:Assigning retained object to unsafe property; object will be released after assignment)在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil,造成野指针。对象一般分配在堆上的某块内存,如果在后续的内存分配中,刚好分到了这块地址,程序就会崩溃掉。
  • 那为什么可以用assign修饰基本数据类型?因为基础数据类型一般分配在栈上,栈的内存会由系统自己自动处理,不会造成野指针。

weak修饰的对象在释放之后,指针地址会被置为nil。所以现在一般弱引用就是用weak。weak使用场景:

2.strong 与copy的区别

3.__block与__weak的区别

4.1 block变量定义时为什么用copy?block是放在哪里的?

特别需要注意的地方就是在把block放到集合类当中去的时候,如果直接把生成的block放入到集合类中,是无法在其他地方使用block,必须要对block进行copy。

[array addObject:[[^{
    NSLog(@"hello!");
} copy] autorelease]];

4.2 block 为什么不用strong?

官方文档:You should specify copy as the property attribute, because a block needs to be copied to keep track of its captured state outside of the original scope. This isn’t something you need to worry about when using Automatic Reference Counting, as it will happen automatically, but it’s best practice for the property attribute to show the resultant behavior

本文全属个人见解,如果您认为说法不正确或者哪里有错误的地方,请在评论中留言或者使用以下联系方式,笔者会在第一时间修正!!!

联系方式:QQ:983202699

关注微博私信:http://weibo.com/490jiulin/home?wvr=5

上一篇下一篇

猜你喜欢

热点阅读