struct student
{
int a; float f; char c; long l;
}; struct person
{
int a; float f; char c; long l; };
void test1(void)
{
int a=; int b; memcpy(&b, &a , sizeof(a)); NSLog(@"b=%i",b);
struct student stu1={,1.5,'x',}; struct student stu2; memcpy(&stu2, &stu1, sizeof(stu1)); NSLog(@"%i, %f,%c, %ld",stu2.a,stu2.f,stu2.c,stu2.l); // struct person per=stu1; struct person per; memcpy(&per, &stu1, sizeof(stu1)); NSLog(@"per: %i,%f,%c,%ld",per.a,per.f,per.c,per.l);
}
void testStringCopy(void)
{
NSString* s1=[[NSString alloc]initWithFormat:@"name:%s","wenhua" ];
NSString* s2 = [s1 copy]; //浅拷贝 NSLog(@"s1:%p, %@",s1,s1); NSLog(@"s2:%p, %@",s2,s2); NSMutableString* s3 = [s1 copy]; NSLog(@"s3:%p,%@",s3,s3); // 不可变字符串的copy方法: 1,浅拷贝,2,还是不可变 NSString* s4 = [s1 mutableCopy]; //深拷贝 NSLog(@"s4:%p,%@",s4,s4); [(__bridge id)(__bridge void *)s4 appendString:@"append"]; NSLog(@"s4:%p,%@",s4,s4); NSLog(@"s1:%p, %@",s1,s1); // 不可变字符串的mutableCopy方法: 1,深拷贝,2,拷贝出来的是可变的 NSMutableString* s5=[[NSMutableString alloc]initWithString:@"string"]; NSMutableString* s6 = [s5 copy]; //深拷贝,但s6不可变 NSLog(@"s5: %p,%@",s5,s5); NSLog(@"s6: %p,%@",s6,s6); // [s6 appendString:@"appendStringFors6"]; // 可变字符串的copy方法: 1,深拷贝,2,,拷贝出来的是不可变的 NSMutableString* s7 = [s5 mutableCopy];//深拷贝,s7是可变的 NSLog(@"s7: %p,%@",s7,s7); [s7 appendString:@"appendStringFors7"]; NSLog(@"s7: %p,%@",s7,s7); // 可变字符串的mutableCopy方法: 1,深拷贝, 2,拷贝出来的是可变的 /* 总结: 拷贝 可变拷贝 copy mutableCopy 不可变字符串NSString调: 浅,不可变 深,可变 可变NSMutableString调: 深,不可变 深,可变     你想啊,mutableCopy后,为了两个对象修改后互不影响,一定是深拷贝啦,不会只是拷贝指针;可变字符串copy后,自然是深拷贝,因为一个可变一个不可变;不可变字符串copy,只需要浅拷贝就行喽! */
} void testArrayCopy(void)
{
/*
不可变数组和可变数组的拷贝情况: 不可变字典和可变字典的拷贝情况:
*/ NSString* s1=@"abcd"; // NSArray* a1=@[@"1",@"2"]; NSMutableArray* a1 = [[ NSMutableArray alloc]initWithArray:@[@"",@""]]; Person* person = [[ Person alloc]init]; NSLog(@"person计数:%lu",[person retainCount]); [a1 addObject:person]; NSLog(@"person计数:%lu",[person retainCount]); NSArray* array1 = [[NSArray alloc]initWithObjects:s1,a1, nil]; NSArray* array2 =[array1 copy]; NSLog(@"array1:%p,%@",array1,array1); NSLog(@"array2:%p,%@",array2,array2); NSMutableArray *array3 = [array1 copy]; NSLog(@"array3:%p,%@",array3,array3); NSMutableArray * array4 = [array1 mutableCopy]; //可变 NSLog(@"array4:%p,%@",array4,array4); NSLog(@"array1:[0]:%p,[1]:%p",array1[],array1[]); NSLog(@"array4:[0]:%p,[1]:%p",array4[],array4[]); [array4 addObject:@"add"]; NSLog(@"array4 count is %lu",[array4 count]);//array4是可变数组 [array1 release]; [array2 release]; [array3 release]; [array4 release]; [person release]; [a1 release];
} void test3(void)
{
Person *person =[[Person alloc]init]; NSLog(@"person的计数:%lu",[person retainCount]); NSMutableArray *array = [[ NSMutableArray alloc]init]; [array addObject:person]; NSLog(@"person的计数:%lu",[person retainCount]); NSMutableArray *newArray = [array mutableCopy];//拷贝了一层 NSLog(@"person的计数:%lu",[person retainCount]); [array release]; [newArray release]; [person release];
} void test4(void)
{
Person* person = [[ Person alloc]init]; NSLog(@"person的计数:%lu",[person retainCount]); NSMutableArray *array = [[ NSMutableArray alloc]init]; [array addObject:person]; NSLog(@"person的计数:%lu",[person retainCount]); //对可变数组调copy方法, NSMutableArray *newArray = [array copy]; // ? 拷贝出来的数组可不可变? 拷了几层? // [newArray addObject:@"add"]; //回答:拷贝出来的数组不可变 NSLog(@"person的计数:%lu",[person retainCount]);
[array release];
[newArray release];
[person release];
}
void test2(void)
{
Person* person = [[ Person alloc]init]; //问:为什么NSString类的实例变量在property语法中要用copy? NSMutableString* name=[[NSMutableString alloc]initWithString:@"wenhua"]; person.name=name; NSLog(@"person.name:%p,name:%p",person.name,name); [name appendFormat:@".奥斯特洛夫斯基"]; NSLog(@"person.name: %@",person.name); //因为传入person对象的name是可变字符串对象,如果用retain来修饰,则会造成在外边就可以修改person对象的实例变量,不符合封装的思想,所以用copy } //拷贝自定义的对象 void copyForObject(void) { /* 理论: 1, 对象如果要调copy方法,就要遵守NSCopy协议 2, 对象如果要调mutableCopy方法,就要遵守NSMutableCopying协议 但是注意: copy方法 不是协议NSCopying的方法 mutableCopy方法 也不是协议NSMutableCopying的方法 copy和mutableCopy都是NSObject实现的方法 因为: 在NSObject实现的copy方法内部调用了协议NSCopying的方法 在NSObject实现的mutableCopy方法内部调用了协议NSMutableCopying的方法 NSCopying规定的方法名: copyWithZone: NSMutableCopying规定的方法名:       mutableCopyWithZone:
*/ /*
#import "Person.h" @implementation Person //协议NSCopying规定的一个方法,这个方法由copy方法内部来调 -(id)copyWithZone:(NSZone *)zone {
Person* person = [[[self class] allocWithZone:zone ]init]; person.name=self.name; return person;
} -(id)mutableCopyWithZone:(NSZone *)zone {
Person* person = [[[self class] allocWithZone:zone ]init]; person.name=self.name; return person;
} @end */
Person* p1 = [[ Person alloc]init]; Person *p2 = [p1 copy];//p1可以调copy,是因为Person类实现了copyWithZone:方法 NSLog(@"p1:%p,p2:%p",p1,p2); Person* p3 = [ p1 mutableCopy];//p1可以调mutableCopy,是因为Person类实现了mutableCopyWithZone:方法 NSLog(@"p3:%p",p3);
}

父类中实现子类的深拷贝

- (id)copyWithZone:(NSZone *)zone {
id copyInstance = [[[self class] allocWithZone:zone] init];
size_t instanceSize = class_getInstanceSize([self class]);
memcpy((__bridge voidvoid *)(copyInstance), (__bridge const voidvoid *)(self), instanceSize);
return copyInstance;
}

//***********************************************

关于容器实现copy或mutableCopy,容器内元素默认都是指针拷贝

除非使用

NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:array]];

实现元素的内容拷贝,深拷贝.

copy和mutableCopy对容器本身是深拷贝,其内部元素是指针拷贝.

//类对象调用copy后,为深拷贝,但是类中属性为指针拷贝

        ApplePie *pie = [[ApplePie alloc]init];
pie.name = @"I am an apple pie"; ApplePie *ala = [pie copy]; NSLog(@"%p %p",ala.name,pie.name);// 相同的地址
NSLog(@"%p %p",ala,pie);// 不同的地址

引用:http://www.cnblogs.com/tangbinblog/p/3964003.html

NSCopy&NSMutableCopy的更多相关文章

  1. iOS开发系列—Objective-C之Foundation框架

    概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NSObject,那么这个对象到底 ...

  2. iOS-几大框架的介绍

    1.Objective-C之Foundation框架 概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objectiv ...

  3. iOS-Objective-C基础

    一.Foundation框架 概述 我们前面的章节中就一直新建Cocoa Class,那么Cocoa到底是什么,它和我们前面以及后面要讲的内容到底有什么关系呢?Objective-C开发中经常用到NS ...

  4. Objective -C学习笔记 之copy(复制)

    //自定义类对象实现copy需要遵守copy协议(否则程序崩溃),实现必须实现的协议方法,里面的代码就决定了你的copy是深是浅 #import <Foundation/Foundation.h ...

  5. 理解Objective-c中的copy

    说一下深拷贝和浅拷贝的基本概念:a指针指向地址A1, 浅拷贝是创建了一个b指针指向地址A1:深拷贝是创建了一个c指针指向地址A2,A1和A2的地址不同. 我们看到NSObject接口里面是已经声明了c ...

  6. OC学习12——字符串、日期、日历

    前面主要学习了OC的基础知识,接下来将主要学习Foundation框架的一些常用类的常用方法.Foubdation框架是Cocoa编程.IOS编程的基础框架,包括代表字符串的NSString(代表字符 ...

  7. iOS总结_UI层自我复习总结

    UI层复习笔记 在main文件中,UIApplicationMain函数一共做了三件事 根据第三个参数创建了一个应用程序对象 默认写nil,即创建的是UIApplication类型的对象,此对象看成是 ...

  8. iOS开发200个tips总结(一)

    tip 1 :  给UIImage添加毛玻璃效果 func blurImage(value:NSNumber) -> UIImage { let context = CIContext(opti ...

  9. NSFileManager 的基本使用方法

    本方法已有个人总结, int main(int argc, const char * argv[]) { @autoreleasepool { NSString *path=@"/Users ...

随机推荐

  1. 从零开始编写自己的C#框架(5)——三层架构介绍

    三层架构对于开发人员来说,已经是司空见惯了,除了大型与超小型项目外,大多都是这种架构来进行开发. 在这里为初学者们简单介绍一下三层架构: (下面内容摘自<趣味理解:三层架构与养猪—<.NE ...

  2. 高级javascript---模块化编程

    随着网站逐渐变成“互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂 网页越来越像桌面程序,需要一个团队分工协作.进度管理.单元测试等等......开发者不得不使用软 ...

  3. Oracle函数之LISTAGG

    最近在学习的过程中,发现一个挺有意思的函数,它可实现对列值的拼接.下面我们来看看其具体用法. 用法: 对其作用,官方文档的解释如下: For a specified measure, LISTAGG  ...

  4. 结婚虽易,终老不易:EntityFramework和AutoMapper的婚后生活

    写在前面 我到底是什么? 越界的可怕 做好自己 后记 上一篇<恋爱虽易,相处不易:当EntityFramework爱上AutoMapper>文章的最后提到,虽然AutoMapper为了En ...

  5. 使用Free Spire.Presentation生成PowerPoint文件

      使用Free Spire.Presentation生成PowerPoint文件 前言 之前有写过一篇使用Free Spire.XLS生成图表的文章,朋友圈内反应还不错,都希望我能继续写下去,把类似 ...

  6. 高版本->低版本迁移,低版本客户端连接高版本数据库EXP导出报错EXP-00008,ORA-01455,EXP-00000

    生产环境: 源数据库:RHEL + Oracle 11.2.0.3 目标数据库:HP-UX + Oracle 10.2.0.4   需求:迁移部分表  11.2.0.3-->10.2.0.4,若 ...

  7. JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件

    一.RFC882文档简单说明 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 ...

  8. CSS技巧(一):清除浮动

    什么是CSS清除浮动? 在非IE浏览器(如Firefox)下,当容器的高度为auto,且容器的内容中有浮动(float为left或right)的元素,在这种情况下,容器的高度不能自动伸长以适应内容的高 ...

  9. ActiveX(五)更好的“ActiveX”?

    前文中四篇随笔.已经可以实现 ActiveX 与 Js 无缝交互. 也就是说借用ActiveX实现更加强大的功能已经完全不是问题.但是.ActiveX 本身还有一个局限性——浏览器兼容问题.如此强大的 ...

  10. jQuery网页版五子棋小游戏源码下载

    体验效果:http://hovertree.com/texiao/game/4/ 网页五子棋源代码: <!DOCTYPE html> <html> <head> & ...