理解strong与weak)强引用与弱引用转载自《http://blog.sina.com.cn/s/blog_7c8dc2d50101lc08.html》
2015-09-14 15:28
337 查看
__weak 和 __strong 会出现在声明中
默认情况下,一个指针都会使用 __strong属性,表明这是一个强引用。这意味着,只要引用存在,对象就不能被销毁。这是一种所期望的行为:当所有(强)引用都去除时,对象才能被收集和释放。
不过,有时我们却希望禁用这种行为:一些集合类不应该增加其元素的引用,因为这会引起对象无法释放。在这种情况下,我们需要使用弱引用(不用担心,内置的集合类就是这么干的),使用 __weak 关键字。NSHashTable
就是一个例子。当被引用的对象消失时,弱引用会自动设置为nil。Cocoa 的 Notification Center 就是这么一个例子,虽然这已经超出纯 Objective-C的语言范畴
自己更深理解:
1.(weak与strong)不同的是:当一个对象不再有strong类型的指针指向它的时候,它就会被释放,即使改对象还有_weak类型的指针指向它;
2.一旦最后一个指向该对象的strong类型的指针离开,这个对象将被释放,如果这个时候还有weak指针指向该对象,则会清除掉所有剩余的weak指针
类比为自己的思想:
一个对象类比为一条狗, 释放对象 类比为 狗要跑掉
逻辑:
strong类型的指针就像是栓住的狗,只要你用绳子拴住狗,那么狗就不会跑掉.
类比 一个对象new过以后,不会自动的释放
如果有5个人都牵着这一条狗(5条绳子栓一只狗) 类比为5个strong类型指针指向一个对象.
除非5个绳子都脱落,否则狗是不会跑掉的,类比,5个strong指针都=nil,则该对象释放
weak型指针就像是一个小孩子指着狗喊道:“看,有一只狗在那里”,只要狗一直被拴着,那么小孩子就能看到狗(weak指针)会一直指向它,
只要狗的绳子脱落,那么狗就会跑掉,不管有多少的小孩在看着它。
只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。
在OC中strong就相当于retain属性,而weak相当于assign。只有一种情况你需要使用weak(默认是strong),就是为了避免retaincycles(就是父类中含有子类{父类retain了子类},子类中又调用了父类{子类又retain了父类},这样都无法release)
默认情况下,一个指针都会使用 __strong属性,表明这是一个强引用。这意味着,只要引用存在,对象就不能被销毁。这是一种所期望的行为:当所有(强)引用都去除时,对象才能被收集和释放。
不过,有时我们却希望禁用这种行为:一些集合类不应该增加其元素的引用,因为这会引起对象无法释放。在这种情况下,我们需要使用弱引用(不用担心,内置的集合类就是这么干的),使用 __weak 关键字。NSHashTable
就是一个例子。当被引用的对象消失时,弱引用会自动设置为nil。Cocoa 的 Notification Center 就是这么一个例子,虽然这已经超出纯 Objective-C的语言范畴
自己更深理解:
1.(weak与strong)不同的是:当一个对象不再有strong类型的指针指向它的时候,它就会被释放,即使改对象还有_weak类型的指针指向它;
2.一旦最后一个指向该对象的strong类型的指针离开,这个对象将被释放,如果这个时候还有weak指针指向该对象,则会清除掉所有剩余的weak指针
类比为自己的思想:
一个对象类比为一条狗, 释放对象 类比为 狗要跑掉
逻辑:
strong类型的指针就像是栓住的狗,只要你用绳子拴住狗,那么狗就不会跑掉.
类比 一个对象new过以后,不会自动的释放
如果有5个人都牵着这一条狗(5条绳子栓一只狗) 类比为5个strong类型指针指向一个对象.
除非5个绳子都脱落,否则狗是不会跑掉的,类比,5个strong指针都=nil,则该对象释放
weak型指针就像是一个小孩子指着狗喊道:“看,有一只狗在那里”,只要狗一直被拴着,那么小孩子就能看到狗(weak指针)会一直指向它,
只要狗的绳子脱落,那么狗就会跑掉,不管有多少的小孩在看着它。
只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。
在OC中strong就相当于retain属性,而weak相当于assign。只有一种情况你需要使用weak(默认是strong),就是为了避免retaincycles(就是父类中含有子类{父类retain了子类},子类中又调用了父类{子类又retain了父类},这样都无法release)
相关文章推荐
- JAVA: httpclient 详细说明——第四章;
- 一文读懂卷积神经网络
- Nginx Http 核心模块中Server Location 配置
- VM虚拟机与宿主机网络互联的方法
- 【网络通信:Volley】Volley开篇
- Linux系统下修改网络配置
- Android 网络通信框架Volley
- Win10微软小娜无法连接网络怎么办?微软小娜无法连接网络问题解决方法
- Linux 下curl模拟Http 的get or post请求。
- HttpClient
- 我的openwrt学习笔记(三十):webserver之uhttpd
- LwIP网络接口结构体---netif
- Android使用VideoView播放网络视频
- tcp/ip详解学习(一)
- Android之HttpClient 和HttpResponse 小结
- HTTP协议详解
- 【解决方案】HTTP could not register URL http://+:6001/
- IOS开发网络篇之──ASIHTTPRequest详解
- HDOJ 5437 Alisha’s Party (优先队列)(长春网络赛)
- ubuntu设置系统时间与网络时间同步