//
// main.m
// Copy基本使用,拷贝的本质:修改其中一个不能影响另外一个。 // 每个oc对象都有copy和mutableCopy方法,前提是必须遵守NSCopying协议实现copyWithZone方法和NSMutableCopying协议实现mutableCopyWithZone方法。 // copy出来的对象是不可变的(NSString,NSArray,NSDictionary),NSMutableString调用copy方法出来的是NSString,mutableCopy出来的对象是可变的(NSMutableString,NSMutableArray,NSMutableDictionary).NSString调用mutableCopy方法出来的是NSMutableString。 // oc大部分对象都遵循了NSCopying和NSMutableCopying协议,自定义对象是没有copy和mutableCopy方法的。
// #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { // 会生成一个新的对象
NSString *srcStr1 = @"lnj";
// 只要是拷贝出来的对象, 拷贝出来的对象中的内容和以前对象中的内容一致
// "一般"情况下拷贝会生成一个新的对象
// 为什么会产生一个新的对象 1.因为拷贝要求修改原来的对象不能影响到拷贝出来得对象 \
修改拷贝出来的对象也不能影响到原来的对象, 所以需要生成一个新的对象 \
.由于以前的对象是一个不可变的对象, 而通过mutableCopy拷贝出来的对象必须是一个可变的对象, 所以必须生成一个新的对象 NSMutableString *copyStr1 = [srcStr1 mutableCopy];
NSLog(@"srcStr = %@, copyStr = %@", srcStr1, copyStr1);
NSLog(@"srcStr = %p, copyStr = %p", srcStr1, copyStr1);//srcStr = 0x100004238, copyStr = 0x100700090 // 会生成一个新的对象
NSMutableString *srcStr2 = [NSMutableString stringWithFormat:@"lnj"];
NSMutableString *copyStr2 = [srcStr2 mutableCopy]; [srcStr2 appendString:@" cool"];
NSLog(@"srcStr = %@, copyStr = %@", srcStr2, copyStr2);
NSLog(@"srcStr = %p, copyStr = %p", srcStr2, copyStr2);//srcStr = 0x100300560, copyStr = 0x100202780 // 会生成一个新的对象
NSMutableString *srcStr3 = [NSMutableString stringWithFormat:@"lnj"];
NSString *copyStr3 = [srcStr3 copy];
[srcStr3 appendString:@" cool"];
NSLog(@"srcStr = %@, copyStr = %@", srcStr3, copyStr3);
NSLog(@"srcStr = %p, copyStr = %p", srcStr3, copyStr3);//srcStr = 0x100204aa0, copyStr = 0x6a6e6c35 //不生成新的对象
// 如果是通过不可变对象调用了copy方法, 那么不会生成一个新的对象(2个都是不可变的,那么可以公用一个算了,只要有一个是可变的,那么修改一个就会影响另外一个,所以不能指向同一个内存空间)。
// 原因: 因为原来的对象是不能修改的, 拷贝出来的对象也是不能修改的,既然两个都不能修改, 所以永远不能影响到另外一个对象, 那么已经符合需求,所以: OC为了对内存进行优化, 就不会生成一个新的对象
NSString *srcStr = @"lnj";
NSString *copyStr = [srcStr copy];
NSLog(@"srcStr = %p, copyStr = %p", srcStr, copyStr);//srcStr = 0x100004238, copyStr = 0x100004238 /*
正是因为调用copy方法有时候会生成一个新的对象, 有时候不会生成一个新的对象
所以: 如果没有生成新的对象, 我们称之为浅拷贝, 本质就是指针拷贝
如果生成了新的对象, 我们称之为深拷贝, 本质就是会创建一个新的对象
*/
return ;
}

oc80--copy的更多相关文章

  1. HEC-ResSim原文档

              HEC-ResSim Reservoir System Simulation             User's Manual       Version 3.1 May 201 ...

  2. 关于ubuntu实机与虚机互相copy

    我的开发环境是在ubuntu上的,但是ubuntu上没有官方支持的QQ,有些不太方便,所以在上面虚了一个Win7(先是win10,但是win10最新版本太坑了,不说了),不过经常会出现复制文件,或者文 ...

  3. 探究@property申明对象属性时copy与strong的区别

    一.问题来源 一直没有搞清楚NSString.NSArray.NSDictionary--属性描述关键字copy和strong的区别,看别人的项目中属性定义有的用copy,有的用strong.自己在开 ...

  4. copy()之绝版应用

    我选用了一个稍稍复杂一点的例子,它的大致功能是:从标准输入设备(一般是键盘)读入一些整型数据,然后对它们进行排序,最终将结果输出到标准输出设备(一般是显示器屏幕).这是一种典型的处理方式,程序本身具备 ...

  5. Marshal.Copy将指针拷贝给数组

    lpStatuss是一个UNITSTATUS*的指针类型实例,并包含SensorDust字段 //定义一个数组类型 byte[] SensorDust = new byte[30] //将指针类型拷贝 ...

  6. @property中的copy.strong.weak总结

    1.NSString类型的属性为什么用copy NSString类型的属性可以用strong修饰,但会造成一些问题,请看下面代码 #import "ViewController.h" ...

  7. block为什么用copy以及如何解决循环引用

    在完成项目期间,不可避免的会使用到block,因为block有着比delegate和notification可读性更高,而且看起来代码也会很简洁.于是在目前的项目中大量的使用block. 之前给大家介 ...

  8. [LeetCode] Copy List with Random Pointer 拷贝带有随机指针的链表

    A linked list is given such that each node contains an additional random pointer which could point t ...

  9. NSString属性什么时候用copy,什么时候用strong?

           我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strong与copy.那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢 ...

  10. iOS 浅谈:深.浅拷贝与copy.strong

    深.浅拷贝 copy mutableCopy NSString NSString *string = @"汉斯哈哈哈"; // 没有产生新对象 NSString *copyStri ...

随机推荐

  1. NGS数据格式介绍

    一般情况下,从Illumina平台上得到的测序,其数据格式是Fastq格式,可以称之为原始数据(Raw data).事实上直接的下机数据是显微拍摄得到的图像信息.但是一般都会用Bcl2Fastq软件将 ...

  2. GetArxPath

    extern HINSTANCE _hdllInstance;CString GetArxPath(){ CString strArxPath; GetModuleFileName(_hdllInst ...

  3. Java基本输入输出

    Java基本输入输出 基本输入 基本输出 package com.ahabest.demo; public class Test { public static void main(String[] ...

  4. mysql导出数据到excel的两种方式

    使用第一种方式如果数据中有换行符的话会自动换行,但使用第二种方式就不会出现这种效果了.两种方式自己选择哈 1:select * from into outfile 'c:/Users/a.xls' t ...

  5. 大理石在哪儿(Where is the Marble?,Uva 10474)

    现有N个大理石,每个大理石上写了一个非负整数.首先把各数从小到大排序,然后回 答Q个问题.每个问题问是否有一个大理石写着某个整数x,如果是,还要回答哪个大理石上 写着x.排序后的大理石从左到右编号为1 ...

  6. Android三角标签View:TriangleLabelView

     Android三角标签View:TriangleLabelView 在一些商城.产品推销类APP中,如淘宝.京东.电影门票销售.商品降价促销这类的APP,常常会在其APP中看到,某些商品的左上角 ...

  7. mongodb local数据库的空间初始化好大啊!

    新建立了一个replicat set,登录到primary里,show dbs一看吓一跳 local数据库竟然占用了80多G的空间 [root@wxlab31 bin]# ./mongo --host ...

  8. Wow! Such Sequence! (线段树) hdu4893

    http://acm.hdu.edu.cn/showproblem.php?pid=4893 先贴上一份还没过的代码,不知道拿出错了  1 // by caonima ; ; ],col[MAX< ...

  9. MYSQL常用的时间日期函数

    #时间日期函数 #获取当前日期XXXX-XX-XXSELECT CURRENT_DATE(); SELECT CURDATE();#效果与上一条相同 #获取当前日期与时间XXXX-XX-XX XX:X ...

  10. js 最简单的实现复制到剪切板 xl_copy

    使用 npm install xl_copy // 项目中安装 import clipboard form 'xl_copy' // 引用 element.onclick = ()=>{     ...