文档章节

iOS中copy和strong的异同

RainOrz
 RainOrz
发布于 05/10 11:02
字数 577
阅读 150
收藏 0
iOS

这一篇写的并不全面,只适用于非容器类型的,对于容器类型的拷贝,另当别论!

首先我们声明以下变量

@property (nonatomic,strong) NSArray *sary;
@property (nonatomic,copy) NSArray *cary;
@property (nonatomic,strong) NSMutableArray *sMuAry;
@property (nonatomic,copy) NSMutableArray *cMuAry;

首先初始化:

self.sary = @[@"1"];
self.cary = @[@"2"];
self.sMuAry = [NSMutableArray arrayWithArray:@[@"3"]];
self.cMuAry = [NSMutableArray arrayWithArray:@[@"4"]];

然后进行如下操作:

    self.sary = self.sMuAry;
    self.cary = self.sMuAry;
    [self.sMuAry addObject:@"5"];
    NSLog(@"%@,,%@,,%@",self.sary,self.cary,self.sMuAry);
    NSLog(@"%p,,%p,,%p",self.sary,self.cary,self.sMuAry);

打印结果:
     (3,5),,(3),,(3,5)
     0x60400024b910,,0x604000017140,,0x60400024b910

由此我们可以得出结论:

 1、strong修饰不可变类型的sary,并且使用sMuAry可变类型给sary赋值,再去修改可变类型sMuAry值的时候,sary所指向的值也会发生改变(浅拷贝)   (3)-->(3,5)
     2、copy修饰不可变类型的cary,并且使用sMuAry可变类型给cary赋值,再去修改可变类型sMuAry值的时候,cary所指向的值不会发生改变(深拷贝)   (3)

 

我们在进行如下操作:

[self.cMuAry addObject:@"6"];

运行程序发现程序崩溃,信息如下:

-[__NSSingleObjectArrayI addObject:]: unrecognized selector sent to instance 0x60400000c870
     2018-05-10 09:58:30.085995+0800 runloop[78679:2916787] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSSingleObjectArrayI addObject:]: unrecognized selector sent to instance 0x60400000c870'
由此我们得出结论:

copy修饰 系统会认为cMuAry是不可变数组 add时会崩溃 改为stong即可

 

接着我们进行如下操作:

NSArray *ary = @[@"11111"];
self.sary = ary;
self.cary = ary;
NSLog(@"%p..%p..%p",ary,self.sary,self.cary);

打印结果:0x604000014cf0..0x604000014cf0..0x604000014cf0

由此我们可以得出结论:

copy修饰不不可变类型(NSString,NSArray等)的时候,且使用不可边类型进行赋值,表示浅拷贝,只拷贝一份指针
strong此时和copy一样

 

然后我们在进行如下操作:

    NSMutableArray *muary = [NSMutableArray arrayWithArray:@[@"12",@"34"]];
    self.sMuAry = muary;
    self.cMuAry = muary;
    NSLog(@"%p..%p..%p",muary,self.sMuAry,self.cMuAry);

打印结果:0x600000253ce0..0x600000253ce0..0x600000220720

我们得出结论:

copy修饰的是可变类型(NSMutableArray,NSMutableString等)的时候,且使用可边类型进行赋值,表示深拷贝,直接拷贝新一份内容,到内存中,表示两份内容
strong依旧是只拷贝指针,浅拷贝

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
RainOrz
粉丝 7
博文 104
码字总数 80823
作品 0
青浦
程序员
Xcode ARC需要什么版本的环境支持

Mac OS X v10.6 和 v10.7 (64位应用) 的Xcode 4.2以上版本支持ARC,iOS 4 和 iOS 5 下ARC都能工作,但Weak不支持Mac OS X v10.6 和 iOS 4,所以要想在iOS 4下运行用ARC的程序,只能用strong。...

东方皓
2013/05/06
0
0
iPhone开发之深入浅出 (2) — ARC之@property使用

上一回我们学到了一些ARC的基本概念,这一次我们来看看ARC对@property的使用规则有何影响。 所有者属性 我们先来看看与所有权有关系的属性,关键字间的对应关系。 属性值 关键字 所有权 stro...

小小贝
2012/12/24
0
0
iOS动画开发之五——炫酷的粒子效果

iOS动画开发之五——炫酷的粒子效果 在上几篇博客中,我们对UIView层的动画以及iOS的核心动画做了介绍,基本已经可以满足iOS应用项目中所有的动画需求,如果你觉得那些都还不够炫酷,亦或是你...

珲少
2015/07/29
0
1
【iOS】定义@property时常用的修饰词介绍

iOS编程中,定义成员变量常用格式如下: 常用的修饰词有atomic,nonatomic,copy,assign,strong,weak,readonly,readwrite等。面试中也会常常被问到这些修饰词的含义及其之间的区别,其本...

浅浅青丘
06/13
0
0
iOS中结合代码看内存管理(一)

阅读本文前,建议移步先去了解下内存管理相关知识。 1: iOS内存管理机制(百度goole大法可以获得很多推荐)。 2: iOS中的动态内存分配 3: 堆栈的原理:堆栈 百科 1:自动释放池的常见问题: ...

Nlinger
2017/06/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

游戏开发经验谈(二):对战类全球服游戏的设计与实现

上篇文章《游戏开发经验谈(一):游戏架构里隐藏的五个坑及其应对方案》,我们主要讲解了游戏架构设计当中隐藏的一些坑及其应对方案,错过的小伙伴可以回溯之前的内容。本期内容,将会重点介...

UCloudTech
10分钟前
0
0
Mysql基本语法

一.联合主键 drop table CONTENT_AND_CATALOG;CREATE TABLE `tobebetter`.`CONTENT_AND_CATALOG` ( `ID` VARCHAR(120) NOT NULL , `CONTENT_ID` VARCHAR(120) , `CA......

我是菜鸟我骄傲
11分钟前
0
0
179. centos7 安装mariadb

1. centos7 中安装mariadb 1.1 执行安装 centos7 自带了mariadb yum -y install mariadb mariadb-server 1.2 启动mariadb systemctl start mariadb 1.3 设置开机启动 systemctl enable maria......

Lucky_Me
19分钟前
0
0
【AI实战】动手训练自己的目标检测模型(YOLO篇)

在前面的文章中,已经介绍了基于SSD使用自己的数据训练目标检测模型(见文章:手把手教你训练自己的目标检测模型),本文将基于另一个目标检测模型YOLO,介绍如何使用自己的数据进行训练。 ...

雪饼
25分钟前
0
0
Git合并指定文件到另一个分支

经常被问到如何从一个分支合并特定的文件到另一个分支。 其实,只合并你需要的那些commits,不需要的commits就不合并进去了。 合并某个分支上的单个commit 首先,用git log或sourcetree工具查...

yeahlife
31分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部