strong、weak、copy、assign 在命名属性时候怎么用
一直都在疑惑属性定义中在什么情况下用strong、在什么情况下用weak?
总结大致如下:
1.weak 是用来修饰代理(delegate)和UI控件。
2.strong 是用来修饰除了代理(delegate)、UI控件、字符串(NSString)以外的对象类型。
3.copy 是用来修饰字符串(NSString)。
4.assign 是用来修饰基本数据类型(非对象类型),如:int、float、bool、menu等。
解析为何控件用weak。
如图(1)所示,第一个描述的是一个控制器上边有一个按钮(button)和控制器本身的view。两者同属于UIView的subviews(子控件),而subviews是以数组形式存在的,它内部有两个地址分别存储view和button。而view本身就是以强指针类型(retain)存在的属性,故当view一直存在的时候subviews就会一直被引用,而subviews中的button就不会消亡,所以控件btn属性声明时可用weak,当然也可以用strong只是官方推荐用weak而已。所以遵循官方声明采用weak。防止内存泄漏带来的性能消耗。

图 1
解析为何代理(delegate)用weak。
如图(2)所示,UITableviewController中的tableview属性(强指针类型)它是直接指向UITableview的,而UITableview中的delegate属性的本质就是UITableviewController ,当delegate是强指针类型的时候会出现循环引用的情况,直接导致两个对象不能销毁,从而引起内存泄漏,所以根据两个对象相互引用,必有一个是弱类型的原则。而tableview是系统定义的我们不能进行改动,故而当我们定义引用类型必须是弱类型(weak)。

图 2
* 未完待续。。。
strong、weak、copy、assign 在命名属性时候怎么用的更多相关文章
- iOS知识基础篇--@property,@synthesize, nonatomic,atomic,strong,weak,copy,assign,retain详解
一.@property 这个关键词的唯一作用就是声明getter.setter方法接口. 二.@synthesize 实现setter.getter方法,找不到实例变量则主动创建一个. 三.nonat ...
- 关于@property()的那些属性及ARC简介【nonatomic,atomic,assign,retain,strong,weak,copy。】
@property()常用的属性有:nonatomic,atomic,assign,retain,strong,weak,copy. 其中atomic和nonatomic用来决定编译器生成的gette ...
- 何时使用copy,strong,weak,assign关键字 定义属性
现在我们看看iOS5中新的关键字strong, weak, unsafe_unretained. 可以与以前的关键字对应学习strong与retain类似,weak与unsafe_unretained ...
- iOS开发-retain/assign/strong/weak/copy/mutablecopy/autorelease区别
依旧本着尊重原创和劳动者的原则,将地址先贴在前面: http://www.cnblogs.com/nonato/archive/2013/11/28/3447162.html,作者Nonato 以下内 ...
- IOS—— strong weak retain assign 学习
转自:http://wenzongliang.iteye.com/blog/1746604 简单讲strong等同retain weak比assign多了一个功能,当对象消失后自动把指针变成nil,好 ...
- [iOS基础控件 - 6.12.3] @property属性 strong weak copy
A.概念 @property 的修饰词 strong: 强指针/强引用(iOS6及之前是retain) weak: 弱智真/弱引用(iOS6及之前是assign) 默认情况所有指针都是强指针 ...
- copy assign retain 修饰属性的set 方法
@property (nonatomic,retain) NSString * name; - (void)setName:(NSString*)name { [name retain]; 把传进 ...
- iOS之属性修饰符 retain、strong和copy区别测试
时不时会有点迷惑属性修饰符retain.strong.copy三者之间的区别,还是把测试过程记录下来好一点! 1.属性修饰符结论 2.给retain.strong.copy修饰的字符串属性赋值指针变化 ...
- strong & weak
Here is a quick summary: A strong reference will keep the object it points to from being deallocated ...
随机推荐
- LOJ121 动态图连通性(LCT)
用LCT维护一下删除时间的最大生成树即可.当然也可以线段树分治. #include<iostream> #include<cstdio> #include<cmath&g ...
- MT【34】正余弦的正整数幂次快速表示成正余弦的线性组合
问题:如何快速把$cos^4xsin^3x$表示成正弦,余弦的线性组合? 分析:利用牛顿二项式展开以下表达式: 再利用欧拉公式$e^{i\theta}=cos\theta+isin\theta$ 比如 ...
- mysql中存储过程
存储过程procedure 存储过程,其本质还是函数——但其规定:不能有返回值: 定义形式: 说明: 1,in:用于设定该变量是用来“接收实参数据”的,即“传入”:默认不写,就是in 2,out:用于 ...
- 自学Linux Shell12.4-for命令
点击返回 自学Linux命令行与Shell脚本之路 12.4-for命令 1. for命令 格式一 for var in list do commands done 格式二 for var in li ...
- 【Luogu4512】多项式除法(FFT)
题面 洛谷 题解 模板题... 我直接蒯我写的东西... 这个除法是带余除法,所以并不能直接求逆解决. 要求的就是给定两个多项式\(A(x),B(x)\),其项数为\(n,m\) 求解一个\(n-m\ ...
- CF848E Days of Floral Colours——DP+多项式求逆/分治NTT
官方题解:http://codeforces.com/blog/entry/54233 就是由简入繁 1.序列处理,只考虑一个半圆 2.环形处理(其实这个就是多了旋转同构) 然后基于分割线邻居的跨越与 ...
- NO.9: 令operator=返回一个reference to *this
1.令赋值操作返回一个reference to *this(除非你有个标新立异的理由,那就随大众- - )
- Docker mysql主主互备和高可用
一.测试环境 1.1 结构图 1.2 版本 操作系统:CentOS 7.3 MySQL版本:5.6.35 Docker版本:18.06.1-ce 使用root用户操作 IP地址说明 IP地址 用途 备 ...
- Java_myBatis_XML代理_延迟加载
使用mybatis的延迟加载,需要两个步骤: 1.在全局配置文件中添加一下语句(lazyLoadingEnabled默认为false,aggressiveLazyLoading默认为true) < ...
- golang格式化输出-fmt包用法详解
golang格式化输出-fmt包用法详解 注意:我在这里给出golang查询关于包的使用的地址:https://godoc.org 声明: 此片文章并非原创,大多数内容都是来自:https:// ...