iOS中copy的用法
1 深复制:内容拷贝,源对象和副本对象指的是两个不同的对象,源对象引用计数器不变,副本对象引用计数器为1
2 浅复制:指针拷贝,源对象和副本对象指的都是同一个对象,对象引用计数器+1,相当于retain
3 只有不可变对象创建不可变副本(copy)才是浅复制,其它的都是深复制
//
// main.m
// CopyTest
//
// Created by Unisk on 13-9-20.
// Copyright (c) 2013年 Test. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Student.h"
#import "GoodStudent.h"
#pragma mark copy
void student()
{
Student *stu1=[Student studentWithName:@"stu1"];
Student *stu2=[stu1 copy];
stu2.name=@"XZQ";
NSLog(@"%@",stu1);
NSLog(@"%@",stu2);
[stu2 release];
}
#pragma mark copy
void goodStudent(){
GoodStudent *gtu1=[GoodStudent goodStudent:11 name:@"xzq"];
GoodStudent *gtu2=[gtu1 copy];
gtu2.age=111;
gtu2.name=@"google";
NSLog(@"%@",gtu1);
NSLog(@"%@",gtu2);
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
goodStudent();
}
return 0;
}
#import <Foundation/Foundation.h> @interface Student : NSObject<NSCopying> @property (nonatomic,copy) NSString *name; +(id)studentWithName:(NSString *)name; @end
//
// Student.m
// CopyTest
//
// Created by Unisk on 13-9-20.
// Copyright (c) 2013年 Test. All rights reserved.
//
#import "Student.h"
@implementation Student
+(id)studentWithName:(NSString *)name
{
Student *stu=[[[[self class] alloc] init] autorelease];
stu.name=name;
return stu;
}
#pragma mark 对象的拷贝
-(id)copyWithZone:(NSZone *)zone
{
Student *stu=[[[self class] allocWithZone:zone] init];
stu.name=self.name;
return stu;
}
-(NSString *)description
{
return [NSString stringWithFormat:@"name is %@",_name];
}
- (void)dealloc
{
[_name release];
[super dealloc];
}
@end
#import "Student.h" @interface GoodStudent : Student @property (nonatomic,assign) int age; +(id)goodStudent:(int) age name:(NSString *)name; @end
#import "GoodStudent.h"
@implementation GoodStudent
+(id)goodStudent:(int)age name:(NSString *)name
{
GoodStudent *goodStu=[GoodStudent studentWithName:name];
goodStu.age=age;
return goodStu;
}
-(id)copyWithZone:(NSZone *)zone
{
GoodStudent *gtu=[super copyWithZone:zone];
gtu.age=_age;
return gtu;
}
-(NSString *)description
{
return [NSString stringWithFormat:@"name=%@,age=%i",self.name,_age];
}
@end


