strong & weak 的理解
import "ViewController.h" @interface ViewController ()
/*weak*/
@property (nonatomic,weak)UISwitch *weakSwitch;
/*strong*/
@property (nonatomic ,strong)UISwitch *strongSwitch;
/*weak*/
@property (nonatomic,weak)UIButton *weakButton;
@end @implementation ViewController /*
1:strong:代表强引用,
2:weak:代表弱引用,
3:我们创建的变量,默认都是强引用
*/ - (void)viewDidLoad {
[super viewDidLoad]; /*
1:局部变量:在该变量创建完对象,就默认有一个强引用,但是当局部变量所在的方法执行完毕后,局部变量就会被销毁。
2:变量用__weak 和 __strong修饰,创建变量时,默认都为__strong,用__weak修饰,如:
__weak UIButton *btn = [[UIButton alloc]init];
则变量该创建完毕就会被销毁,可以通过打印变量的内存地址:%p打印内存地址来查看有没有被销毁 */ //1:__weak和__strong的理解
__weak UIButton *btn = [[UIButton alloc]init];
NSLog(@"------1----btn=%p-------",btn);//btn对象被销毁
UILabel *label = [[UILabel alloc]init];//label为局部变量,对象没被立即销毁,直到viewDidLoad方法执行完毕后销毁 //2:属性weak,strong的理解: //weak引用:也就是弱指针引用:创建完对象后立即被销毁
self.weakSwitch = [[UISwitch alloc]init];//创建完对象后立即被销毁
NSLog(@"------2----self.weakSwitch=%p-------",self.weakSwitch); //strong强指针引用:创建完对象不会立即销毁,直到控制器销毁的时候,该变量才会被销毁
self.strongSwitch = [[UISwitch alloc]init];
NSLog(@"------3----self.strongSwitch=%p-------",self.strongSwitch); //3:将强引用的指针赋值给弱引用指针:self.weakSwitch对象不会被销毁
/*
1:因为[[UISwitch alloc]init]创建出一个对象后,默认有一个强引用,不会立即销毁,直到整个方法执行完毕后才会销毁。有一个强引用self.strongSwitch指向Switch对象,则Switch对象直到整个控制器销毁的时候才会被释放。
2:self.weakSwitch = self.strongSwitch;将强引用对象赋值,其实也就是将强引用的指针赋值给弱引用,也就是两个指针指向同一块内存地址,但是两者区别,一个而是强引用,一个是弱引用。 3:所以Switch对象分别有一个强引用指针和一个弱引用指针,为什么没有立即被销毁?是因为还有一个强指针引用switch对象 */
self.weakSwitch = self.strongSwitch;
NSLog(@"-----4----- self.weakSwitch=%p-------", self.weakSwitch); //4:self.weakButton没有被销毁, /*
1:打印5,6,7其中,57,self.weakButton没有被销毁,因为 UIButton *button = [[UIButton alloc]init] 创建出对象默认有一个强引用,只要该方法没有执行完,就不会被销毁,即使有若指针指向
2:但是6中打印却被销毁,因为其为成员变量,出了该方法的作用域,没有了强指针指向了所以会被立即销毁 3:打印5,6,7self.weakButton都没有被销毁,若将button添加到self.view上,则在addSubview时,view会对button有一个强引用,出了该方法的作用域,self.view依然有一个强引用指向button,所以对象不会被销毁,self.weakButton指针可以找到该内存地址,所以self.weakButton也不会被销毁
4:[[UIButton alloc]init] 操作是向内存申请开辟一段内存空间,button为一个指针,指向这块内存地址,默认为强指针,若是局部变量,则出了方法的作用域,强指针引用消失,这块内存地址也就会被释放。弱指针指向的内存区域不存在,若指针也消失被释放 self.weakButton = button;此操作是将指针赋值给self.weakButton,则self.weakButton也指向同一块的内存空间,但是若指针,但是在该方法作用域内,这块内存空间一直被强指针引用,所以弱指针指向的这块内存空间依然可以被找到,弱指针也没有被释放。 5:若是 __weak UIButton *btn = [[UIButton alloc]init];或是 self.weakSwitch = [[UISwitch alloc]init];若是以上两种写法,则对象立即被释放。两者都是直接弱指针赋值,没有强引用,所以创建完毕后立即销毁
*/ UIButton *button = [[UIButton alloc]init];
self.weakButton = button;
NSLog(@"----5---- self.weakButton=%p-------", self.weakButton);
[self test];
[self.view addSubview:button]; /*
5:关于xib中拖线时控件用weak修饰:因为viewcontroller对view有一个强引用,控件添加到view时,则view又对控件有一个强引用,当从控制器拖线时,显示为weak,因为view已经有一个强引用了,保证了控件不被销毁,其实strong也可以,因为销毁的顺序为,控制器先销毁,上面的view没有了强引用,也就被销毁,控件没有了view的强引用,和控制器的强引用则依然被销毁 */ } - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated];
NSLog(@"----6---- self.weakButton=%p-------", self.weakButton);
} - (void)test { NSLog(@"----7---- self.weakButton=%p-------", self.weakButton); } @end
strong & weak 的理解的更多相关文章
- 对于atomic nonatomic assign retain copy strong weak的简单理解
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作 1)atomic 设置成员变量的@property属性时,atomic是默认值,提供多线程安全 在多线程环 ...
- ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy)
ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy) 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了, ...
- IOS—— strong weak retain assign 学习
转自:http://wenzongliang.iteye.com/blog/1746604 简单讲strong等同retain weak比assign多了一个功能,当对象消失后自动把指针变成nil,好 ...
- strong & weak
Here is a quick summary: A strong reference will keep the object it points to from being deallocated ...
- 关于@property()的那些属性及ARC简介【nonatomic,atomic,assign,retain,strong,weak,copy。】
@property()常用的属性有:nonatomic,atomic,assign,retain,strong,weak,copy. 其中atomic和nonatomic用来决定编译器生成的gette ...
- assign,copy,strong,weak,nonatomic的理解
举个例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作: 1 在堆上分配一段 ...
- ios strong weak 的区别 与 理解
先一句话总结:strong类保持他们拥有对象的活着,weak类他们拥有的对象被人家一牵就牵走,被人家一干就干死.(strong是一个好大哥所以strong,呵呵,weak是一个虚大哥所以weak,呵呵 ...
- assign,copy,strong,weak,nonatomic的具体理解
例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作: 1 在堆上分配一段内存 ...
- copy,retain,assign,strong,weak的区别
引用地址:http://www.aichengxu.com/view/32930 一.assign,copy,retain 1.copy是内容复制,新建一个相同内容的不同指针,retain为指针复制, ...
随机推荐
- transfer learning(matlab 实现)
一句话总结 transfer learning 的核心即是对一个已训练模型微调,使其适应新的应用,如下图示: 为 matlab 接口所训练完成的经典深度神经网络下载地址:Index of /matco ...
- Apache通用日志工具commons-logging和Log4j使用总结
转自:https://blog.csdn.net/lzl13391522110/article/details/53758536 Apache通用日志工具commons-logging和Log4j使用 ...
- 洛谷P3391 【模板】文艺平衡树(Splay)(FHQ Treap)
题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...
- Windows/Linux下磁盘使用的图形化工具简介
Windows/Linux下磁盘使用的图形化工具简介 如何以图形界面查看磁盘及分区的大小及剩余容量呢?今天我为大家介绍两款Windows/Linux下磁盘使用的图形化工具分别是Spacesniff ...
- 轻松学习Linux之用户账户管理及实例
Linux用户管理基础 (下载清晰视频:http://down.51cto.com/data/158699) 轻松学习Linux之用户账户管理的实例-跨硬盘移动数据 (此处视频不清楚下按下面地址下载清 ...
- 1.3 Quick Start中 Step 2: Start the server官网剖析(博主推荐)
不多说,直接上干货! 一切来源于官网 http://kafka.apache.org/documentation/ Step 2: Start the server Step : 启动服务 Kafka ...
- Fiddler代理配置
1.下载安装软件Fiddler 2.Fiddler设置HTTPS代理(如果代理的是https请求的需要操作这一步) 打开Fiddler,菜单栏:Tools -> Fiddler Options ...
- grep 过滤器基础
grep是一种文本搜索工具,能使用正则表达式搜索文本,并把匹配的行显示出来. grep 选项 模式 文件 grep "bash" /etc/passwd 将/etc/passwd下 ...
- [Mobx] Use MobX actions to change and guard state
This lesson explains how actions can be used to control and modify the state of your application. Th ...
- 最新GitHub新手使用教程(Windows Git从安装到使用)——详细图解
说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.叙述 1.Git简介 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本 ...