美文网首页iOS BlogiOS进阶指南面试
iOS开发中 Strong 和 weak 的深入理解

iOS开发中 Strong 和 weak 的深入理解

作者: Paulpang | 来源:发表于2016-06-08 11:25 被阅读5999次
最近项目不是太忙,闲下来总结一下容易让程序员困扰的一些问题,如有不准确的地方,还请多多指正。

ARC是苹果为了简化程序员对内存的管理,推出的一套内存管理机制,对象的申请和释放工作会在运行时,由编译器自动添加retain和release。

在开发中什么时候使用strong,什么时候使用weak,什么时候使用copy呢?

强指针Strong:

强指针:strong修饰的属性一般不会自动释放;
       在OC中,对象默认是强指针,在实际开放中一般属性对象一般用strong来修饰(NSArray,NSDictionary),在使用懒加载定义控件的时候,一般也用strong

eg:
@property (nonatomic, strong) NSArray *dataList;
@property (nonatomic, strong) UILabel *label;

懒加载控件
- (UILabel *)label {
if (_label == nil) {
    _label = [[UILabel alloc] init];
}
return _label;
}

弱指针Weak:

在使用 sb 或者 xib 给控件拖线的时候,为什么拖出来的先属性都是用 weak 修饰呢?
eg

@property (weak, nonatomic) IBOutlet UILabel *label;

原因是由于在向 xib 或者 sb 里面添加控件的时候,添加的子视图是添加到了跟视图 View 上面, 而 控制器 Controller 对其根视图 View 默认是强引用的,当我们的子控件添加到 view 上面的时候, self.view addSubView: 这个方法会对添加的控件进行强引用,如果在用 strong 对添加的子控件进行修饰的话,相当于有两条强指针对子控件进行强引用, 为了避免这种情况,所以用 weak 修饰.

注意: 
1. addSubView 默认对其 subView 进行了强引用
2.在纯手码实现界面布局时,如果通过懒加载处理界面控件,需要使用strong强指针

除此之外,我们在开发的时候用的代理 也是用 weak 进行修饰的,其目的是为了防止控件的循环引用.

@property (nonatomic, weak) id<PersonDelegate> delegate;

Copy的使用

对于 copy 的使用,网上已经有很多关于 copy 介绍, 其包括深 copy 和浅 copy, 在这里我就不再多说了,如果不太明白的话可以网上查一下资料

copy 一般用来修饰 NSString 和 block

eg:

@property (nonatomic, copy) NSString *str;

以上内容是对 strong 和 weak的个人理解,后续会持续完善,今天就写到这里,现在要继续写代码了.

相关文章

网友评论

  • kirito_song:不可变字符串用copy。博主觉得不可变的字典、数组需要用copy声明么
  • 菠萝吹雪xs:9.0的测试了一下,也没有问题的
  • e43e5251876a:xib拖线首先说明并非都是weak,数据类型的修饰用strong还是cooy看实际情况分析,属性不被其他属性赋值,strong,copy没有什么影响,但是属性被其他属性更改赋值,看你是否需要改变原值,如果需要,则用strong,不希望原值被修改,则用copy
  • taocejun:如果一个控件在定义成属性的时候用strong修饰,然后在用代码添加到视图控制器的self.view上,也就是你说的出现两个强指针引用,会出现内存泄漏吗?
    陈雨尘:delegate 不是用 assign 修饰的吗 我记得
    taocejun:@叫我困兽 应该不会导致内存泄漏,只是引用计数加1的问题,如果说在一个视图控制器用strong定义一个textview,然后添加到self.view上面;让textview调用removefromsuperview这个方法,虽然textview从父视图移除,但是这个textview在内存中还是存在,尽管在界面上不显示了。通过这个逻辑可以理解成这样:textview通过strong修饰,引用计数+1-->添加到父视图上,引用计数再次+1;然后从父视图移除-->引用计数-1;--->由于视图控制器还在,所以这个textview不会被销毁。可以试一下,用week修饰,如果从父视图移除这个textview,那么应该是会被销毁的,我也没有试,猜想而已
    叫我困兽:这贴沉了,我也想这么问
  • 夏了_南城:为什么懒加载的时候用strong呢 如果用strong的话 不也是出现了2个强指针引用么 不太懂 求解释
  • 最初的你我:学习了~感谢
  • 38e282c64235:‘相当于有两条强指针对子控件进行强引用’,这种情况有什么负作用吗?
  • 二石兄:受益匪浅,做笔记时几处笔误:

    1. 在实际开**放**中**一般属性对象一般**用strong来修饰(发)(对象属性一般)
    2. 添加的子视图是添加到了 ** 跟 ** 视图 View 上面(根)
    3. 如果 ** 在 ** 用 strong 对添加的子控件进行修饰的话(再)
    Paulpang:@俊杰_li 谢谢,下次我会注意文字表述的问题:+1:
  • a2aec3811d1e:不错。。 :relaxed:
  • 细雨听风:字典数组遵守copy协议的话,是一个不可变的
  • 斯文_7:字典和数组最好也用copy修饰
    Paulpang:@SevenAnt 感觉说服力不强,控件也遵守 NSCopy 协议 .
    斯文_7:@Paulpang 字典、数组、还有字符串都遵守copy协议
    Paulpang:@SevenAnt 能给出具体理由吗?
  • Paulpang:文字写的不错 :clap:

本文标题:iOS开发中 Strong 和 weak 的深入理解

本文链接:https://www.haomeiwen.com/subject/amrjdttx.html