oc中的拷贝分为:copy(浅拷贝)和mutablecopy(深拷贝)。

浅拷贝也为指针拷贝,拷贝后原来的对象计数器会+1;

深拷贝为对象拷贝,原来的对象计数器不变。

注意:自定义对象拷贝时要实现NSCoping协议或NSMutableCopying协议.且构造方法和copyWithZone方法中最好用[self class]来代替类名

下面以NSString的拷贝 和Student,DoodStudent的copy(实现NSCoping协议)为例展示:

OC学习基本快告一段落了,终于可以见到IOS界面了呵呵呵呵。。。。。闲话少说直接上代码:

主函数:

//
// main.m
// Copy
//
// Created by WildCat on 13-7-27.
// Copyright (c) 2013年 wildcat. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Student.h"
#import "GoodStudent.h"
#pragma mark 练习mutablecopy语法(深拷贝)对象拷贝。
void mutablecopyTest(){ NSString *string =[[NSString alloc] initWithFormat:@"Age is %i",10];
//调用MutableCopy方法,产生一个可变的对象,MutableCopy后的对象和原来的对象不是同一个对象 ,原来的对象和新建的对象的计数器都是1
NSMutableString *str=[string mutableCopy];
[str appendString:@" no is 123"];
NSLog(@"String's:%@ :count is %zi,\n str's: %@: count is %zi",string,[string retainCount],str,[str retainCount]);
[str release]; [string release]; }
#pragma mark copy的练习 copy是浅拷贝(指针拷贝),对象只是做了retain操作
void copyTest(){
NSString *string =[[NSString alloc] initWithFormat:@"Age is %i",10];
//调用Copy方法,产生一个可变的对象,copy后的对象和原来的对象是同一个对象 ,对象的计数器都是+1
NSLog(@"Count:%zi",[string retainCount]);
NSString *str=[string copy];
NSLog(@"Count:%zi",[string retainCount]); NSLog(@"%i",str==string); [str release];
[string release]; }
void studentNameCopy(){ Student *stu=[[[Student alloc] init] autorelease];
NSMutableString *str=[NSMutableString stringWithFormat:@"Jack"];
stu.name=str;
NSLog(@"name is :%@",stu.name);
[str appendString:@" 你好。"];
NSLog(@"name is :%@",stu.name); //因为是用的copy方法 ,所以内容不变。如果用retain name会变
NSLog(@"str is:%@",str); }
void copyStudent(){ Student *stu1=[Student studentWithName:@"lixingle"];
Student *stu2=[stu1 copy];
NSLog(@"Name1 is :%@",stu1.name);
NSLog(@"Name2 is :%@",stu2.name);
stu1.name=@"lele";
NSLog(@"Name1 is :::%@",stu1.name);
NSLog(@"Name2 is :::%@",stu2.name);
[stu2 release]; }
#pragma mark GOOdStudent 的copy练习
void goodStudentCopy(){
GoodStudent *good1=[GoodStudent goodStudentWithAge:10 Name:@"乐乐"];
GoodStudent *good2=[good1 copy]; //改变good1,good2不会变
good1.name=@"长超";
NSLog(@"good1: %@",good1);
NSLog(@"good2: %@",good2);
[good2 release]; } int main(int argc, const char * argv[])
{ @autoreleasepool { //copyTest();
//studentNameCopy();
//copyStudent();
goodStudentCopy(); }
return 0;
}

Student类(例子中父类)

#import <Foundation/Foundation.h>
//对象Copy需要实现NSCoping协议
@interface Student : NSObject<NSCopying>
//NSString 对象一般用copy,外边的内容改变里边的内容不变。retain:当外边的内容改变时里边的内容也会改变
//其他对象建议用retain
@property (nonatomic,copy) NSString *name;
+(id)studentWithName:(NSString *) name;
-(id)copyStudent;
@end
//
// Student.m
// Copy
//
// Created by WildCat on 13-7-27.
// Copyright (c) 2013年 wildcat. All rights reserved.
// #import "Student.h" @implementation Student
@synthesize name=_name;
+(id)studentWithName:(NSString *) name{
//这里用[self class] ,方便子类调用
Student *stu=[[[[self class] alloc] init] autorelease];
stu.name=name;
return stu;
} #pragma mark 实现协议
//实现协议,要实现copyWithZone 方法
-(id)copyWithZone:(NSZone *)zone{
//这里创建的对象不需要释放,在外边释放 ;这里用[self class] ,方便子类调用
Student *stu=[[[self class] allocWithZone:zone] init];
stu.name=self.name;
return stu;
}
- (void)dealloc
{
[_name release];
[super dealloc];
}
//重写description方法
-(NSString *)description{
return [NSString stringWithFormat:@"name is %@",self.name]; }
@end

GoodStudent类(子类)

#import "Student.h"

@interface GoodStudent : Student
@property (nonatomic,assign)int age;
+(id) goodStudentWithAge:(int) age Name:(NSString *)name;
@end
#import "GoodStudent.h"

@implementation GoodStudent
+(id) goodStudentWithAge:(int) age Name:(NSString *)name{
GoodStudent *good=[GoodStudent studentWithName:name];
good.age=age;
return good; }
-(id)copyWithZone:(NSZone *)zone{
GoodStudent *copy=[super copyWithZone:zone];
copy.age=self.age;
return copy; }
-(NSString *)description{ return [NSString stringWithFormat:@"name is :%@,age is:%i,",self.name,self.age]; } @end

Object-c学习之路十二(OC的copy)的更多相关文章

  1. zigbee学习之路(十二):zigbee协议原理介绍

    一.前言 从今天开始,我们要正式开始进行zigbee相关的通信实验了,我所使用的协议栈是ZStack 是TI ZStack-CC2530-2.3.0-1.4.0版本,大家也可以从TI的官网上直接下载T ...

  2. IOS学习之路十二(UITableView下拉刷新页面)

    今天做了一个下拉刷新的demo,主要用到了实现的开源框架是:https://github.com/enormego/EGOTableViewPullRefresh 运行结果如下: 实现很简单下载源代码 ...

  3. Java学习之路(十二):IO流<二>

    字符流 字符流是可以直接读写字符的IO流 使用字符流从文件中读取字符的时候,需要先读取到字节数据,让后在转换为字符 使用字符流向文件中写入字符时,需要把字符转为字节在写入文件 Reader和Write ...

  4. 嵌入式Linux驱动学习之路(十二)按键驱动-poll机制

    实现的功能是在读取按键信息的时候,如果没有产生按键,则程序休眠在read函数中,利用poll机制,可以在没有退出的情况下让程序自动退出. 下面的程序就是在读取按键信息的时候,如果5000ms内没有按键 ...

  5. Java学习之路(十二):IO流<三>

    复习:序列流 序列流可以把多个字节输入整合成一个,从序列流中读取到数据时,将从被整合的第一个流开始读取,读完这个后,然后开始读取第二个流,依次向后推. 详细见上一篇文章 ByteArrayOutput ...

  6. Java学习之路(十二):IO流

    IO流的概述及其分类 IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流(读写数据)     输出流(写数据) 流按操作 ...

  7. java痛苦学习之路[十二]JSON+ajax+Servlet JSON数据转换和传递

    1.首先client须要引入 jquery-1.11.1.js 2.其次javawebproject里面须要引入jar包  [commons-beanutils-1.8.0.jar.commons-c ...

  8. FastAPI 学习之路(二十)接口文档配置相关

    系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...

  9. VSTO 学习笔记(十二)自定义公式与Ribbon

    原文:VSTO 学习笔记(十二)自定义公式与Ribbon 这几天工作中在开发一个Excel插件,包含自定义公式,根据条件从数据库中查询结果.这次我们来做一个简单的测试,达到类似的目的. 即在Excel ...

随机推荐

  1. 2013国内IT行业薪资对照表【技术岗】

    (本文为转载,具体出处不详) 说薪水,是所有人最关心的问题.我只 想说如果想在薪水上面满意,在中国,没有哪里比垄断国企好.电力.烟草.通信才是应该努力的方向.但是像我们这种搞研发的进IT行业似乎是注定 ...

  2. WSAEventSelect

    WSAEventSelect 是 WinSock 提供的一种异步事件通知I/O模型,与 WSAAsyncSelect模型有些类似.       该模型同样是接收 FD_XXX 之类的网络事件,但是是通 ...

  3. 关于IE6幽灵字体

    前言:今天做项目的时候在IE6下出现了这样的一种现像,这种情况只在IE6下出现,最后在网友的帮助下这个问题最终得到了解决.所以马上作了下笔记! 情况如下图: 我在网上找了点资料出现IE6下幽灵字体的情 ...

  4. 基于java callable及future接口解决生产者消费者问题

    这两天复习java线程时,把java里面的线程基本知识点与jdk1.5以后新添加的一些类的使用都了解了一下,借用生产者消费者的问题来将他们实践一下. 题目:(题目在csdn一大牛的空间找的) 生产者- ...

  5. Swift 流程控制

    import Foundation ...{ == { print(index) } } // 可选变量 类型后面加? var myName:String?="jikexueyuan&quo ...

  6. jQuery事件与事件对象

    事件是脚本编程的灵魂,本篇来介绍jQuery中的事件处理及事件对象. 事件与事件对象 首先,我们来看一下经常使用的添加事件的方式: <input type="button" ...

  7. Android开源项目及库搜集

    TimLiu-Android 自己总结的Android开源项目及库. github排名 https://github.com/trending,github搜索:https://github.com/ ...

  8. PHP内置Web Server探究(二)自定义PHP控制台输出console函数

    我们在开发APP的服务器端,当和APP进行联调时通常需要实时跟踪URL请求和参数的接收情况. 但PHP并没有像Python或Java专有的控制台输出函数,Python的print()和Java的Sys ...

  9. 批处理更新svn

    很多软件都有命令行支持,即可以直接在Windows命令提示符下输入软件提供命令来执行,完成软件的一些功能. 比如输入svn help 可以查看svn支持的命令行 想要更新svn资源需要用到命令svn ...

  10. [Python 3.x 官方文档翻译]Whetting Your Appetite 欢迎您的使用

    If you do much work on computers, eventually you find that there’s some task you’d like to automate. ...