从一个弱引用导致的奔溃 谈 weak assign strong的应用场景【iOS开发教程】
从一个弱引用导致的奔溃 谈 weak assign strong的应用场景
.h中的定义方法一:
@property (nonatomic, assign) NSArray *dataSource;
定义方法二
@property (nonatomic, strong) NSArray *dataSource;
.m中的实现方法
- (void)viewDidLoad {
[super viewDidLoad];
if (YES) {
NSArray *array = @[@"1", @"2", @"3"];
self.dataSource = array;
}
if (self.dataSource.count > 2) {
NSLog(@"self.dataSource 是否能打印?能打印说明可以定义为assign");
}
}
结果。h中方法⓵崩溃了,方法⓶可以执行,
但是如果还是用方法⓵该如何,解决呢?
- (void)viewDidLoad {
[super viewDidLoad];
if (YES) {
NSArray *array = @[@"1", @"2", @"3"];
self.dataSource = [array copy];
}
if (self.dataSource.count > 2) {
NSLog(@"self.dataSource 是否能打印?能打印说明可以定义为assign");
}
}
或者
- (void)viewDidLoad {
[super viewDidLoad];
if (YES) {
NSArray *array = @[@"1", @"2", @"3"];
self.dataSource = [NSArray arrayWithArray:array];
}
if (self.dataSource.count > 2) {
NSLog(@"self.dataSource 是否能打印?能打印说明可以定义为assign");
}
}
总之,这两种改进方案,和strong一个道理,strong是在setter中,就对等号右边的值进行了strong操作,
那为什么把上面的self.dataSource改成_dataSource同样不会引起崩溃呢?
_dataSource
编译器自动生成了setter方法,并生成了_dataSource 这个iVar变量,指向的是同一块儿内存区域。
同时也可以看出,strong也影响到了_dataSource的赋值。看下MRC会更直观:
ARC的setter
// _age的setter和getter
- (void)setAge:(int)age
{
_age = age;
}
MRC的setter
//@property (nonatomic, retain) NSString *name;
- (void)setName:(NSString *)name
{
if (_name != name) {
[_name release];
_name = [name retain];
}
}
//@property(nonatomic, copy) NSString *name;
- (void)setName:(NSString *)name
{
if (_name != name) {
[_name release];
_name = [name copy];
}
}
从一个弱引用导致的奔溃 谈 weak assign strong的应用场景【iOS开发教程】的更多相关文章
- Ubuntu 16.04升级4.7.0内核后导致Compiz奔溃,问题:compiz[4852]: segfault at 48 ip 00007f88cae087f0 sp 00007ffce354c268 error 4 in libscale.so
由于硬件的驱动支持问题,升级4.7.0的内核主要是为了能使用Intel HD Graphics 630驱动,但是也出现了相关问题,比如Compiz的特效导致桌面上如果有多个相同程序启动,然后再次点击时 ...
- android app记录执行日志 捕获奔溃异常 ,存储日志到文件
app在执行过程中.为了后期的维护升级,记录日志是一个很好的方法. 为了读取到app执行时的日志,一般的作法是单独开一个线程,在app执行的启动线程.然后app退出时停掉线程. 然而我们更好的方法是开 ...
- 简单说说.Net中的弱引用
弱引用是什么? 要搞清楚什么是弱引用,我们需要先知道强引用是什么.强引用并不是什么深奥的概念,其实我们平时所使用的.Net引用就是强引用.例如: Cat kitty = new Cat(); 变量ki ...
- Java中的弱引用
Strong references StringBuffer buffer = new StringBuffer(); 普通的对象创建都是这种类型,只要buffer还存在,对象就不会被GC回收.同时也 ...
- 弱引用?强引用?未持有?额滴神啊-- Swift 引用计数指导
ARC ARC 苹果版本的自动内存管理的编译时间特性.它代表了自动引用计数(Automatic Reference Counting).也就是对于一个对象来说,只有在引用计数为0的情况下内存才会被释放 ...
- .NET 强引用和弱引用
一:什么是弱引用 了解弱引用之前,先了解一下什么是强引用 例如 : Object obj=new Object(); 就是一个强引用,内存分配一份空间给用以存储Object数据,这块内存有一个 ...
- weak 弱引用的实现方式
来源:冬瓜争做全栈瓜 链接:https://desgard.com/weak/ 对于 runtime 的分析还有很长的路,最近在写 block 系列的同时,也回顾一下之前疏漏的细节知识.这篇文章是关于 ...
- .NET中的弱引用
弱引用是什么? 要搞清楚什么是弱引用,我们需要先知道强引用是什么.强引用并不是什么深奥的概念,其实我们平时所使用的.Net引用就是强引用.例如: Cat cat = new Cat(); 变量cat就 ...
- 讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(中)- IOS不为人知的Bug
前言: 话说昨晚还是前晚,写了一篇:讲述Sagit.Framework解决:双向引用导致的IOS内存泄漏(上) 文章写到最后时,多了很多莫名奇妙的问题!!! 为了解决了这些莫名奇妙的问题,我又战斗了2 ...
随机推荐
- 数据结构算法C语言实现(十四)--- 4.1&4.2串的类型定义、表示及实现
一.简述 [暂无] 二.头文件 //4_2_part1.h /** author:zhaoyu */ //2016-6-10 //----串的定长顺序存储表示---- #include "h ...
- hihoCoder #1164 随机斐波那契
时间限制:5000ms单点时限:1000ms内存限制:256MB描述 大家对斐波那契数列想必都很熟悉: $a_0 = 1, a_1 = 1, a_i = a_{i-1} + a_{i-2}, (i & ...
- AngularJs ngReadonly、ngSelected、ngDisabled
ngReadonly 该指令将input,textarea等文本输入设置为只读. HTML规范不允许浏览器保存类似readonly的布尔值属性.如果我们将一个Angular的插入值表达式转换为这样的属 ...
- POJ 1365 Prime Land(数论)
题目链接: 传送门 Prime Land Time Limit: 1000MS Memory Limit: 10000K Description Everybody in the Prime ...
- FZU 1752 A^B mod C(快速加、快速幂)
题目链接: 传送门 A^B mod C Time Limit: 1000MS Memory Limit: 65536K 思路 快速加和快速幂同时运用,在快速加的时候由于取模耗费不少时间TLE了 ...
- BZOJ3282: Tree
传送门 又是权限题= =,过了NOIp我就要去当一只权限狗! LCT裸题,get到了两个小姿势. 1.LCA操作应该在access中随时updata 2.Link操作可以更简单 void Link(i ...
- python模块app登陆认证(M2Crypto数字证书加密)
需求: 1.通过数字证书,非对称加密方式传送对称秘钥给服务端 2.用户名.密码使用对称秘钥加密,发送服务端验证 3.传送数据使用字节流方式 实现思路: 1.了解python的struct模块,用于字节 ...
- ios动态添加属性的几种方法
http://blog.csdn.net/shengyumojian/article/details/44919695 在ios运行过程中,有几种方式能够动态的添加属性. 1-通过runtime动态关 ...
- mysql 根据查询结果集更新
声明: MySQL4.0之后的版本可以支持下面sql语句进行更新操作 应用场景: 一个表中的字段需要根据查询结果集进行更新,或者从另一表查询获得 其本质还是更新的数据需要查询获得. 例如: use ...
- base64 convert to file
var fs= require('fs') var imageFile = dataUrl.replace(/^data:image\/\w+;base64,/, ""); var ...