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. OpenSSL之PKey的EVP封装

    在Openssl中,非对称加密涉及到两个密钥.一个为公开的密钥(公钥),一个为非公开的密钥.而OpenSSL中非对称加密算法有RSA.DSA.ECC,他们的原理不同,因此其密钥结构不同.下面我们列出我 ...

  2. 飞行模式下不让打开FM

     android 判断手机当前是否是飞行模式,在AirplaneModeEnabler中 提供了isAirplaneModeOn方法来判断当前是否是Airplane mode:public stati ...

  3. python实现websocket服务器,可以在web实时显示远程服务器日志

    一.开始的话 使用python简单的实现websocket服务器,可以在浏览器上实时显示远程服务器的日志信息. 之前做了一个web版的发布系统,但没实现在线看日志,每次发布版本后,都需要登录到服务器上 ...

  4. springmvc的讲解

    概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 ...

  5. C#基础语法总结

    C#笔记——基础篇 一.入门知识 VS中的常用快捷键 Ctrl+K+D:快速对齐代码 Ctrl+Z:撤销 Ctrl+S:保存(一定要经常保存!) Ctrl+J:快速弹出智能提示 Shift+End . ...

  6. hdu 2013

    水题 AC代码: #include <iostream> using namespace std; int main() { int i,m,n; while(cin>>n) ...

  7. Flexbox属性查询列表

    1.任何一个flexbox布局的第一步是需要创建一个flex容器.为此给元素设置display属性的值为flex.在Safari浏览器中,你依然需要添加前缀-webkit. .flexcontaine ...

  8. .net ADF 中 Ajax 的调用过程.

    图示是 .net ADF Ajax调用过程的简略过程: 1,2)当页面初始化之后, 浏览器一旦触发回调事件, 脚本函数负责处理回调信息, 并调用 ASP.NET 2.0/3.5 中的 WebForm_ ...

  9. 使用UISegementControl实现简易汤姆猫程序

    // // TomViewController.m #import "TomViewController.h" #import <AVFoundation/AVFoundat ...

  10. Canvas--2

    Canvas2(关键词:setLineDash .rect .strokeRect .clearRect .arc.sin .strokeText )   绘制其他样式: lineCap 结束端点的设 ...