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 ...
随机推荐
- Django前端获取后端数据之前端自定义函数
在写网站的时候遇到了一个问题: Django在后端向前端传数据时,多数会使用dict字典来传送多个数据,但前端只能遍历,没有一个用key取到value值的方法可以直接使用 如果作为一个list传递到前 ...
- Linux 常用命令——which, whereis, locate, find
转载请注明出处:http://blog.csdn.net/drecik__/article/details/8455399 1. which 查找使用命令所在的位置 2. whereis 搜索文件,跟 ...
- Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流)
Libre 6011 「网络流 24 题」运输问题 (网络流,最小费用最大流) Description W 公司有m个仓库和n个零售商店.第i个仓库有\(a_i\)个单位的货物:第j个零售商店需要\( ...
- java -server 和 -client 的不同,及 java -server 时抛错原因
在dos窗口运行:java -server Error: missing `server' JVM at `C:\Program Files\Java\jre7\bin\server\jvm.dll' ...
- 文件拷贝, 使用 BIO,NIO的对比,四种写法性能分析。
测试环境: jdk 1.7 + 2G内存 测试代码基本上复制了: http://blog.csdn.net/tabactivity/article/details/9317143 1 2 3 4 5 ...
- hdu 1114Piggy-Bank(完全背包)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 参考资料: [1]:https://www.cnblogs.com/jbelial/ar ...
- python2.x到python3.x函数变化
首先,python 3.x中urllib库和urilib2库合并成了urllib库. 其中urllib2.urlopen()变成了urllib.request.urlopen() urllib2.Re ...
- Prometheus+grafana搭建
一.简介 1.1 Prometheus Prometheus是一套开源的监控系统,它将所有信息都存储为时间序列数据:因此实现一种Profiling监控方式,实时分析系统运行的状态.执行时间.调用次数等 ...
- golang格式化输出-fmt包用法详解
golang格式化输出-fmt包用法详解 注意:我在这里给出golang查询关于包的使用的地址:https://godoc.org 声明: 此片文章并非原创,大多数内容都是来自:https:// ...
- scala面向对象.高阶函数,柯里化,Actor编程简介
1.定义一个类 class Person{ //用val修饰的变量是只读属性,有getter但是没有setter val id ="111" //用var修饰的变量既有getter ...