Object-c学习之路十二(OC的copy)
来源:互联网 发布:印度超级联赛直播数据 编辑:程序博客网 时间:2024/06/07 03:40
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)
- Object-c学习之路(oc点语法)
- Object-c学习之路七(oc字符串操作)
- Object-c学习之路二(oc内存管理黄金法则1)
- Object-c学习之路四(oc内存管理autorelease)
- Object-c学习之路六(oc字符串文件读写)
- Object-C 学习笔记(十二)---Foundation之NSNumer
- object-c的copy方法
- OC语法——Object-C retain、copy、mutableCopy的详细分析
- object - c 学习之:oc里面常用的基本数据类型和限定词
- Object-c学习笔记十二-----特性
- OC学习小结之copy语法
- OC学习笔记(8)Object-C组合使用
- OC学习笔记(10)Object-C方法链表
- OC学习笔记(9)Object-C多态的使用
- object-c 复制 (copy)
- 【Object-C】Copy
- OC语法之Copy
- JavaMail读发邮件
- eclipse svn插件 将一个项目中的修改提交到两外一个svn路径上去
- NSFileHandle
- IOS应用程序文件目录的操作
- cocox2d-x HelloWorld分析
- Object-c学习之路十二(OC的copy)
- Set接口
- C++中虚表指针的存放位置
- HDU 4620
- 解读一淘网(etao)首页响应式兼容ie6~ie8实现方法
- Direct3D 11 简介
- php错误级别
- HDU 4618
- MySQL数据库问题收集