IOS学习笔记十八(copy、mutableCopy、NSCopying、NSMutableCopy、深复制、浅复制)

1、 copy、mutableCopy方法

copy方法返回对象的不可修改的副本

mutableCopy方法返回的对象可修改的副本

 

1)、测试demo

int main(int argc, char * argv[]) {@autoreleasepool {NSMutableString *book = [NSMutableString stringWithString:@"chenyu"];NSMutableString *bookCopy = [book mutableCopy];[bookCopy replaceCharactersInRange:NSMakeRange(1, 2) withString:@"gong"];NSLog(@"book is %@", book);NSLog(@"bookCopy is %@", bookCopy);NSString *str = @"chenyu";NSMutableString *strCopy = [str mutableCopy];[strCopy appendString:@"chenyu"];NSLog(@"strCopy is:%@", strCopy);//由于str2是不可变的,所以运行下面会报错NSMutableString *str2 = [str copy];NSLog(@"str copy chen is:%@", str2);
//        [str2 appendString:@"chenyu"];}
}

 

2)、运行结果

 

2018-07-15 19:03:35.564049+0800 cyTest[27254:9418105] book is chenyu
2018-07-15 19:03:35.565157+0800 cyTest[27254:9418105] bookCopy is cgongnyu
2018-07-15 19:03:35.566056+0800 cyTest[27254:9418105] strCopy is:chenyuchenyu
2018-07-15 19:03:35.566857+0800 cyTest[27254:9418105] str copy chen is:chenyu

 

 

 

 

 

 

 

2、NSCopying、NSMutableCopy协议

对象调用copy方法来复制自身的可变副本,需要类实现NSCopying协议,让该类实现copyWithZone方法

对象调用mutableCopy方法来复制自身的可变副本,需要类实现NSMutbaleCopying协议,让类实现mutableCopyWithZone方法demo可以看下下面写的浅复制

 

 

 

 

 

 

 

 

3、深复制和浅复制

我个人理解感觉浅复制是复制后的属性(指针变量)指向的地址都是同一块地址,当复制后的对象属性值发生变化的时候,原始值也发生了变化。

深复制就是复制后的属性(指针变量)指向的地址不是同一块地址,当复制后的对象属性值发生变化的时候,原始值不会发生变化。

 

1)、浅复制测试Demo

Dog.h

#import <Foundation/Foundation.h>
#ifndef Dog_h
#define Dog_h@interface Dog : NSObject<NSCopying>
@property (nonatomic, strong) NSMutableString *name;
@property (nonatomic, assign) int age;
@end
#endif /* Dog_h */

 

Dog.m

 

#import <Foundation/Foundation.h>
#import "Dog.h"@implementation Dog
@synthesize name;
@synthesize age;
-(id)copyWithZone:(NSZone *)zone
{Dog *dog = [[[self class] allocWithZone:zone] init];dog.name = self.name;dog.age = self.age;return dog;
}
@end

 

main.m

 

        Dog *dog1 = [Dog new];dog1.name = [NSMutableString stringWithString:@"chen"];dog1.age = 1;NSLog(@"dog1.name is %@ and age is %d", dog1.name, dog1.age);//浅复制Dog *dog2 = [dog1 copy];
//        dog2.name = [NSMutableString stringWithString:@"li"];[dog2.name replaceCharactersInRange:NSMakeRange(1, 2) withString:@"hel"];dog2.age = 20;NSLog(@"dog2.name is %@ and age is %d", dog2.name, dog2.age);NSLog(@"dog1.name is %@ and age is %d", dog1.name, dog1.age);

 

2)、运行结果

 

2018-07-15 19:03:35.567556+0800 cyTest[27254:9418105] dog1.name is chen and age is 1
2018-07-15 19:03:35.567690+0800 cyTest[27254:9418105] dog2.name is cheln and age is 20
2018-07-15 19:03:35.567768+0800 cyTest[27254:9418105] dog1.name is cheln and age is 1

 

3)、深复制Demo

 

Dog.h文件一样

Dog.m文件有点变化

#import <Foundation/Foundation.h>
#import "Dog.h"@implementation Dog
@synthesize name;
@synthesize age;
-(id)copyWithZone:(NSZone *)zone
{Dog *dog = [[[self class] allocWithZone:zone] init];
//    dog.name = self.name;dog.name =  [self.name mutableCopy];dog.age = self.age;return dog;
}
@end

 

main.m文件一样

 

        Dog *dog1 = [Dog new];dog1.name = [NSMutableString stringWithString:@"chen"];dog1.age = 1;NSLog(@"dog1.name is %@ and age is %d", dog1.name, dog1.age);//深复制Dog *dog2 = [dog1 copy];
//        dog2.name = [NSMutableString stringWithString:@"li"];[dog2.name replaceCharactersInRange:NSMakeRange(1, 2) withString:@"hel"];dog2.age = 20;NSLog(@"dog2.name is %@ and age is %d", dog2.name, dog2.age);NSLog(@"dog1.name is %@ and age is %d", dog1.name, dog1.age);

 

4)、运行结果

 

2018-07-15 19:13:08.751335+0800 cyTest[27529:9427019] dog1.name is chen and age is 1
2018-07-15 19:13:08.751686+0800 cyTest[27529:9427019] dog2.name is cheln and age is 20
2018-07-15 19:13:08.751885+0800 cyTest[27529:9427019] dog1.name is chen and age is 1

 

 

 

 

 

 

4、setter方法的复制选项

我们setter方法复制选项的时候,如果加了copy属性,比如setName方法

-(void)setName : (NSMutableStrinfg *)name
{self.name  = [name copy];}
#import <Foundation/Foundation.h>
#import "Dog.h"@implementation Dog
@synthesize name;
@synthesize age;
@end

 

所以当对象设置了name属性的话,就不能再改变了,如下demo

 

Dog.h

#import <Foundation/Foundation.h>
#ifndef Dog_h
#define Dog_h@interface Dog : NSObject
@property (nonatomic, copy) NSMutableString *name;
@property (nonatomic, assign) int age;
@end
#endif /* Dog_h */

 

Dog.m

 

#import <Foundation/Foundation.h>
#import "Dog.h"@implementation Dog
@synthesize name;
@synthesize age;
@end

 

main.m

 

        Dog *dog1 = [Dog new];dog1.name = [NSMutableString stringWithString:@"chen"];dog1.age = 1;[dog1.name appendString:@"hello"];

 

运行结果

2018-07-15 19:22:17.736557+0800 cyTest[27853:9436238] -[NSTaggedPointerString appendString:]: unrecognized selector sent to instance 0xa0000006e6568634
2018-07-15 19:22:17.739655+0800 cyTest[27853:9436238] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSTaggedPointerString appendString:]: unrecognized selector sent to instance 0xa0000006e6568634'
*** First throw call stack:
(0   CoreFoundation                      0x0000000104fd61e6 __exceptionPreprocess + 2941   libobjc.A.dylib                     0x000000010466b031 objc_exception_throw + 482   CoreFoundation                      0x0000000105057784 -[NSObject(NSObject) doesNotRecognizeSelector:] + 1323   CoreFoundation                      0x0000000104f58898 ___forwarding___ + 14324   CoreFoundation                      0x0000000104f58278 _CF_forwarding_prep_0 + 1205   cyTest                              0x0000000103d60438 main + 6006   libdyld.dylib                       0x0000000108a2f955 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

很明显,报错了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/289512.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编程心得03

新的一年2016&#xff0c;再接再厉&#xff01; 转载于:https://www.cnblogs.com/Anzhongliu/p/6091848.html

光伏领跑者火热前行 可靠性护航“长跑”

随着第三批光伏领跑者申报标准的出台&#xff0c;在目前普通电站指标有可能缩水的情况下&#xff0c;2017年8-10GW的光伏领跑者项目又将成为各电站投资商争夺的“红海”。光伏领跑者在过去两年时间里为行业带来的变化有目共睹&#xff0c;从模式创新到电价下降&#xff0c;快速…

鸿蒙os系统被推送,鸿蒙来了!华为大规模推送鸿蒙OS系统,造成网站一度瘫痪...

千呼万唤始出来&#xff0c;期盼已久的手机鸿蒙OS系统终于迎来了大规模推送&#xff01;今年2月份在华为Mate X2折叠屏手机发布会上&#xff0c;华为就曾表示将在4月份开始大规模推送鸿蒙OS系统&#xff0c;4月27日通过测试申请的用户正式接到升级鸿蒙OS系统的通知&#xff0c;…

jps、jinfo、jstat、jstack、jmap、jconsole等命令简介

2019独角兽企业重金招聘Python工程师标准>>> JDK提供了几个很实用的工具&#xff0c;如下&#xff1a; jinfo&#xff1a;观察运行中的java程序的运行环境参数&#xff1a;参数包括Java System属性和JVM命令行参数&#xff0c;java class path等信息。命令格式&…

读《底层逻辑》

《底层逻辑》本书作者是刘润&#xff0c;他在得到上开设了课程《5 分钟商学院》&#xff0c;我也是在得到上知道的这本书&#xff0c;这本书在豆瓣上的评分不是很高&#xff0c;褒贬不一&#xff0c;不过我看着觉得挺好。看了一些豆瓣的评论&#xff0c;觉得这本书不好有这么几…

IOS学习笔记十九NSArray和NSMutableArray

1、NSArray NSArray不可变集合&#xff0c;不能添加新元素和删除已有元素和替换元素 2、demo Dog.h #import <Foundation/Foundation.h> #ifndef Dog_h #define Dog_hinterface Dog : NSObject property (nonatomic, strong) NSString *name; property (nonatomic, as…

centOS安装Mysql指南

centOS安装Mysql指南 说明&#xff1a;使用操作系统centOS6.4 32位系统&#xff1b;mysql:mysql-5.7.10-linux-glibc2.5-i686.tar.gz; 一、准备 下载mysql wget http://mirrors.sohu.com/mysql/mysql:mysql-5.7.10-linux-glibc2.5-i686.tar.gz 注&#xff1a;所有shell命令都以…

2016年:勒索病毒造成损失预估超过10亿美元

根据趋势科技公布的最新报告&#xff08;PDF&#xff09;&#xff0c;2016年是敲诈勒索软件频发的一年&#xff0c;同比增长752%&#xff0c;预测由Locky、Goldeneye等勒索病毒所造成的损失超过10亿美元。报告中同时指出企业和个人是勒索软件的重灾区&#xff0c;而且勒索病毒还…

python3.6字典有序_为什么从Python 3.6开始字典有序并效率更高

在Python 3.5&#xff08;含&#xff09;以前&#xff0c;字典是不能保证顺序的&#xff0c;键值对A先插入字典&#xff0c;键值对B后插入字典&#xff0c;但是当你打印字典的Keys列表时&#xff0c;你会发现B可能在A的前面。 但是从Python 3.6开始&#xff0c;字典是变成有顺序…

Linux的进程/线程间通信方式总结

2019独角兽企业重金招聘Python工程师标准>>> Linux系统中的进程间通信方式主要以下几种: 同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程通信方式&#xff1a;包括信号量(Semaphore), 消息队列(Me…

开源作者去世后,代码谁来继承?

文 | 肖滢出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013)2008 年初&#xff0c;澳大利亚一对兄弟 Simon Zerner 和 Toby Zerner 开始了 esoTalk 的开发。不幸的是&#xff0c; esoTalk 尚处于 Alpha 阶段&#xff0c;主力开发人员哥哥 Simon 就在 2009 年年中去世。…

html 整数转换为小数,二进制如何四舍五入 十进制小数怎么转换为二进制小数?...

二进制是否有类似十进制中“四舍五入”的说法二进制转换成十进制保留小数部分是否要四舍五入&#xff0c;...应当采用“零舍一入”(相当于十进制数的“四舍五入”)。用38线译码器74ls138&#xff0c;实现3位二进制的四舍五入&#xff0c;38线译码器输入对应的110为十进制数6&am…

Android之popWindows底部弹出挡住了华为虚拟键盘问题

1、问题 使用popWindows的时候底部弹出遮挡华为虚拟键盘 2、解决办法 在调用下面代码之前 popupWindow.showAtLocation 加上如下的代码进行设置 popupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

项目中使用CLR编程

1、创建自己的项目 2、右键“解决方案。。。”→添加→新建项目→C#→数据库→SQL Server项目,如下图所示: 3、选择操作数据库

SDN火爆!未来五年年复合增长率达98%

在如今的网络世界&#xff0c;软件定义网络SDN和网络功能虚拟化NFV成为了新的“宠儿”&#xff0c;特别是对于运营商来说&#xff0c;已经将它们视为面向未来转型的关键。因此已经有越来越多的运营商开始尝试引入SDN和NFV技术&#xff0c;尽管它们的标准还尚未完善。 最早采用S…

python桌面程序开发_程序员之路:python3+PyQt5+pycharm桌面GUI开发

先看效果&#xff1a;图 1 没错&#xff0c;学过C#的同学应该很熟悉这个界面&#xff0c;按钮风格和界面风格很相似&#xff0c;万万没想到&#xff0c;python也可以做出这样的界面&#xff0c;简直了&#xff01;&#xff08;图 1&#xff09; 正文开始 一、安装python 为啥要…

转: MySQL 赋予用户权限(grant %-远程和localhost-本地区别)

2019独角兽企业重金招聘Python工程师标准>>> ‍‍相关参考资料&#xff1a;MySQL 赋予用户权限命令的简单格式可概括为&#xff1a;grant 权限 on 数据库对象 to 用户一、grant 普通数据用户&#xff0c;查询、插入、更新、删除 数据库中所有表数据的权利。 grant s…

面试技巧与注意事项

1、面试中的基本礼仪 (1)一旦和用人单位约好面试时间后&#xff0c;一定要提前5-10分钟到达面试地点&#xff0c;以表示求职者的诚意&#xff0c;给对方以信任 感&#xff0c;同时也可调整自己的心态&#xff0c;作一些简单的仪表准备&#xff0c;以免仓促上阵&#xff0c;手忙…

kafka控制台模拟消费_Kafka 详解

kafka简介Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区的&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper协调的分布式消息系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各种需…

Android之运行PopupWindow提示Unable to add window -- token null is not valid; is your activity running?

1、问题 在使用PopupWindow的时候,我们构建好了直接放在Activity的onCreate函数里面直接运行,提示这个错误 Unable to add window -- token null is not valid; is your activity running? 2、原因分析 popupWindow显示依赖activity,并且要等activity所有的生命周期方法…