1:copy拷贝得到的对象都是不可变对象,MutableCopy拷贝得到的对象都是可变对象。MutableCopy拷贝得到的对象都是新的对象,会重新分配内存地址,而copy拷贝的对象既可以是新对象,也有可能是原来的对象,也就是内存地址可能与原来相同,可通过打印对象的%p内存地址来查看。当copy一个对象时,若对象不可变,则拷贝出的新对象内存地址原对象内存地址相同,是同一个对象,但是当copy时,对象是可变的,新拷贝出来的对象内存地址会不同,也就是会得到一个新的对象。

void string()
{
NSString *string = @""; NSString *str1 = [string copy]; // 没有产生新对象
NSMutableString *str2 = [string mutableCopy]; // 产生新对象 NSLog(@"%p %p %p", string, [string copy], [string mutableCopy]);
} void mutableString()
{
NSMutableString *string = [NSMutableString string];
[string appendString:@""];
[string appendString:@""]; NSString *str1 = [string copy]; // 产生新对象
NSMutableString *str2 = [string mutableCopy]; // 产生新对象
[string appendString:@""]; }

2:深拷贝与浅拷贝:深拷贝也就是拷贝出的对象是新的对象,是内容的拷贝,浅拷贝没有产生新的对象,只是指针的拷贝

3:@property中的copy:

@interface XMGPerson : NSObject
@property (nonatomic, assign) int age;
@property (nonatomic, assign) double money; /** name属性值永远是不可变,所以定义为NSMutableString是不合理的 */
@property (nonatomic, copy) NSMutableString *name;
@end
#import "XMGPerson.h"

@interface XMGPerson() <NSCopying>

@end

@implementation XMGPerson

- (id)copyWithZone:(NSZone *)zone
{
XMGPerson *person = [[XMGPerson allocWithZone:zone] init];
person.age = self.age;
return person;
} //- (void)setName:(NSString *)name
//{
// _name = [name copy];
//} //- (id)mutableCopyWithZone:(NSZone *)zone
//{
//
//} @end

1:当字符串用copy修饰时,在set方法中其实调用了

_name = [name copy];name经过copy之后,得到的对象是不可变的,所以属性用可变字符串修饰时不合理的。若是strong修饰字符串时,只是简单的赋值,将外界的值赋值给name,外界值更改,则属性值也会更改

2:对象执行copy或是MutableCopy操作,内部会调用

- (id)copyWithZone:(NSZone *)zone,id是返回的copy的对象,zone是为copy的对象开辟的空间,

- (id)mutableCopyWithZone:(NSZone *)zone 两个方法前提都是先要遵守

NSCopying 或是  NSMutableCopying协议

4:当我们去自定义对象的时候,调用copy和mutableCopy两个方法,需要自己去遵守NSCopying, NSMutableCopying协议,并实现

- (id)copyWithZone:(NSZone *)zone,- (id)mutableCopyWithZone:(NSZone *)zone。

 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

     Person *person1 = [[Person alloc]init];
NSLog(@"person1的内存地址为----%p",person1); Person *person2 = [person1 copy];
NSLog(@"person2的内存地址为----%p",person2); Person *person3 = [person1 copy];
NSLog(@"person3的内存地址为----%p",person3); }
 #import "Person.h"
@interface Person ()<NSCopying,NSMutableCopying> @end
@implementation Person - (instancetype)copyWithZone:(NSZone *)zone { Person *person = [[Person allocWithZone:zone] init];
return person;
} - (instancetype)mutableCopyWithZone:(NSZone *)zone { Person *person = [Person allocWithZone:zone];
return person;
} @end

知识总结:1:非自定义类调用copy都得到不可变对象,有可能会产生新对象,有可能不产生新对象,mutableCopy得到的对象都是可变的,会产生新对象,深拷贝,是内容拷贝,产生新对象,浅拷贝是指针拷贝,不产生新对象。2:当自定义类时,调用copy和mutableCopy都需要遵守NSCopying, NSMutableCopying协议,实现- (id)copyWithZone:(NSZone *)zone,- (id)mutableCopyWithZone:(NSZone *)zone,分别打印三个内存地址,得到的内存地址都不一样,则自定义类无论调用copy和mutableCopy都产生了新对象。

copy 和 MutableCopy的更多相关文章

  1. Objective-C中的Strong、Copy与MutableCopy

    面试过程中经常被问到ARC中Strong.Copy的区别是什么.普通的回答是:一样.文艺(正确)的回答是:分情况(我擦!WQY#$&Y**%OWEUR) 可以先参考这篇文章http://www ...

  2. 对copy、mutableCopy理解

    Objective - C 中有很多在日常项目中经常用到的常用代码,在这里着重的讲一下关于copy 和 mutableCopy 的区别以及相关用法. Objective - C 中可变对象和不可对象经 ...

  3. 集合使用copy与mutableCopy的区别

    集合(NSArray,NSSet,NSDictionary等)使用copy与mutableCopy的区别是类似的,下面以NSMutableArray.NSArray 为例子验证如下: NSMutabl ...

  4. 探讨NSString和NSMutableString的内存问题以及copy和MutableCopy两个方法

    NSString: //main.m #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { ...

  5. NSArray和NSMutableArray的copy和MutableCopy

    NSArray: //main.m #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { ...

  6. iOS Copy 和 MutableCopy的区别 深浅拷贝的区别-供参考

    概述 对于系统的非容器类对象,对一不可变对象复制,copy是指针复制(浅拷贝)和mutableCopy就是对象复制(深拷贝).如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的. 对于 ...

  7. 【转】copy 和 mutablecopy (深拷贝和浅拷贝)

    阅读本文之前首先了解copy与retain的区别,如果有不正确的地方望大家多多指教: copy与retain的区别: copy是创建一个新对象,retain是创建一个指针,引用对象计数加1.Copy属 ...

  8. copy和mutableCopy的深、浅拷贝

    对象拷贝主要由两种方式:copy和mutableCopy.浅拷贝是指直接将指针指向原有的地址,从而达到复制的目的.深拷贝是指重新生成一个对象,将原有对象的内容复制到新的对象中.copy 返回的是一个不 ...

  9. 关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解

    最近对深浅拷贝(复制)做了一些研究,在此将自己的理解写下来,希望对大家有所帮助.本人尚处在摸索阶段,希望各位予以指正. 本文包括如下方向的探索: 1.指针与对象: 2.深/浅拷贝(复制): 3.可变/ ...

  10. copy和mutableCopy都是浅拷贝!!!------你被骗了很多年

    所有系统容器类的copy或mutableCopy方法,都是浅拷贝!!! (ps:什么是容器?比如NSArray,NSMutableArray,NSDictionary,NSMutableDiction ...

随机推荐

  1. HDU 1495 很可乐(BFS 倒水问题)

    题意  将体积为s的可乐  利用容积分别为n和m的两个杯子平均分为两份  至少须要倒多少次可乐 能够把容器s,n,m中装的可乐量看成一种状态 容器都是没有刻度的  所以每次倒可乐要么把自己倒完 要么把 ...

  2. js20---接口3种方式

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  3. Funui-Theme 资源的替换

    实现资源的替换,需要分为以下几个步骤 1.找到需要更改的模块 mediatek/packages/apps/FileManager 2.到主题模块下根据包名找到相应资源(以Grass为例) cd ve ...

  4. php课程 13-43 mysql的数据结构是什么

    php课程 13-43 mysql的数据结构是什么 一.总结 一句话总结:cs结构,客户端,服务器 1.常用的比较出名的数据库有哪些? SQL数据库(关系型):1.收费:DB2SqlserverOra ...

  5. MyBatis学习总结(12)——Mybatis+Mysql分页查询

    package cn.tsjinrong.fastfile.util; /**  * @ClassName: Page  * @Description: TODO(分页组件的父类,用来封装分页的 通用 ...

  6. innodb next-key lock解析

    參考http://blog.csdn.net/zbszhangbosen/article/details/7434637#reply 这里补充一些: (1)InnoDB默认加锁方式是next-key ...

  7. 看<Asp.net夜话>随笔(2013-10-13)

    1.Asp.net内置对象 1.1Request对象 封装了客户端请求信息 1.2Response对象 代表了服务器响应对象,可以向客户端返回数据 1.3Server对象 是用于获取服务器的相关信息的 ...

  8. 洛谷——P1598 垂直柱状图

    https://www.luogu.org/problem/show?pid=1598 题目描述 写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过72个字符),然后用柱状图输出每个字 ...

  9. [Android 性能优化系列]内存之提升篇--应用应该怎样管理内存

    大家假设喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 原文地 ...

  10. 最新GitHub新手使用教程(Windows Git从安装到使用)——详细图解

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 一.叙述 1.Git简介 Git(读音为/gɪt/.)是一个开源的分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本 ...