Object-c学习之路十二(OC的copy)
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)的更多相关文章
- zigbee学习之路(十二):zigbee协议原理介绍
一.前言 从今天开始,我们要正式开始进行zigbee相关的通信实验了,我所使用的协议栈是ZStack 是TI ZStack-CC2530-2.3.0-1.4.0版本,大家也可以从TI的官网上直接下载T ...
- IOS学习之路十二(UITableView下拉刷新页面)
今天做了一个下拉刷新的demo,主要用到了实现的开源框架是:https://github.com/enormego/EGOTableViewPullRefresh 运行结果如下: 实现很简单下载源代码 ...
- Java学习之路(十二):IO流<二>
字符流 字符流是可以直接读写字符的IO流 使用字符流从文件中读取字符的时候,需要先读取到字节数据,让后在转换为字符 使用字符流向文件中写入字符时,需要把字符转为字节在写入文件 Reader和Write ...
- 嵌入式Linux驱动学习之路(十二)按键驱动-poll机制
实现的功能是在读取按键信息的时候,如果没有产生按键,则程序休眠在read函数中,利用poll机制,可以在没有退出的情况下让程序自动退出. 下面的程序就是在读取按键信息的时候,如果5000ms内没有按键 ...
- Java学习之路(十二):IO流<三>
复习:序列流 序列流可以把多个字节输入整合成一个,从序列流中读取到数据时,将从被整合的第一个流开始读取,读完这个后,然后开始读取第二个流,依次向后推. 详细见上一篇文章 ByteArrayOutput ...
- Java学习之路(十二):IO流
IO流的概述及其分类 IO流用来处理设备之间的数据传输,Java对数据的操作是通过流的方式 Java用于操作流的类都在IO包中 流按流向分为两种:输入流(读写数据) 输出流(写数据) 流按操作 ...
- java痛苦学习之路[十二]JSON+ajax+Servlet JSON数据转换和传递
1.首先client须要引入 jquery-1.11.1.js 2.其次javawebproject里面须要引入jar包 [commons-beanutils-1.8.0.jar.commons-c ...
- FastAPI 学习之路(二十)接口文档配置相关
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- VSTO 学习笔记(十二)自定义公式与Ribbon
原文:VSTO 学习笔记(十二)自定义公式与Ribbon 这几天工作中在开发一个Excel插件,包含自定义公式,根据条件从数据库中查询结果.这次我们来做一个简单的测试,达到类似的目的. 即在Excel ...
随机推荐
- [ES6] Module export
Default export: Default export is easy way to export a function to outside module. //flash-message.j ...
- 关于material和sharedMaterial的问题
在unity3d中,Renderer组件有两个属性:material和sharedMaterial,它们都可以用来获取Renderer的材质属性.但是它们之间却又很大的区别,下面通过示例来讲解一下. ...
- AIX-df命令
df 命令显示文件系统的总空间和可用空间信息.FileSystem 参数指定文件系统驻留的设备的名称,文件系统的安装目录或文件系统的相对路径名.File 参数指定非安装点的文件或目录.如果指定 Fil ...
- DataGrid( 数据表格) 组件[7]
本节课重点了解 EasyUI 中 DataGrid(数据表格)组件的使用方法,这个组件依赖于Panel(面板).Resizeable(调整大小).LinkButton(按钮).Pageination( ...
- this——笔记
this是执行上下文中的一个属性.this与上下文中可执行代码的类型有直接关系,this值在进入上下文时确定,并且在上下文运行期间永久不变. 在这里一切都简单.在全局代码中,this始终是全局对象本身 ...
- (转)反射发送实战(-)InvokeMember
反射是.net中的高级功能之一,利用反射可以实现许多以前看来匪夷所思的功能,下面是我看了<Programming C#>(O'Reilly)之后对于反射的一点实践,本想直接做个应用程序来说 ...
- (转)c#缓存介绍
在 ASP.NET 提供的许多特性中,缓存支持无疑是最值得欣赏的特性.相比 ASP.NET 的所有其他特性,缓存对应用程序的性能具有最大的潜在影响,利用缓存和其他机制,ASP.NET 开发人员可以接受 ...
- javascript 倒计时跳转.
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 初学Java ssh之Spring 第四篇
今天我来学习学习Spring中Bean. 在Spring中原来还有<beans.../>标签啊,它相当于<bean.../>标签的老爸,老爸可以有很多个儿子,但是老爸只有一个哦 ...
- 武汉科技大学ACM :1002: 零起点学算法28——判断是否闰年
Problem Description 输入年份,判断是否闰年 Input 输入一个整数n(多组数据) Output 如果是闰年,输出yes,否则输出no(每组数据一行) Sample Input 2 ...