转载请注明:
- 概念
- 内存管理
- NSString的copy实例
- 对象的copy实例
一、概念
目的:在改变原有对象的时候,不会改变新对象的值
- Copy:实现NSCopying协议,创建的是一个不可变副本
- MutableCopy:实现NSMutableCopying协议,创建的是一个可变副本
二、内存管理
- 深拷贝:产生新的对象,所以源对象计数器不变>>>对象拷贝
- 浅拷贝:不产生新对象,所以源对象计数器加一>>>指针拷贝(因为对象本身不可以变,所有没有必要再创建一个对象)
三、NSString的copy实例
//// main.m// Copy语法//// Created by apple on 14-3-28.// Copyright (c) 2014年 apple. All rights reserved.//#importvoid test1(){ NSString *str = [NSString stringWithFormat:@"age is %i", 10]; NSString *str1 = [str copy]; NSLog(@"%i", str == str1); NSString *str2 = [str mutableCopy]; NSLog(@"%i", str2 == str);}void test2(){ NSMutableString *str = [NSMutableString stringWithFormat:@"age is %i", 11]; NSString *str1 = [str copy]; NSMutableString *str2 = [str mutableCopy]; [str appendFormat:@"1"]; NSLog(@"%i", str == str2); NSLog(@"%i", str == str1); NSLog(@"%@", str); NSLog(@"%@", str1);}int main(int argc, const char * argv[]){ @autoreleasepool { test2(); } return 0;}
四、对象拷贝的实例
对象的拷贝,主要注意点
- 必须实现NSCopying协议
- 需要重写- (id)copyWithZone:(NSZone *)zone方法
- 代码中 self class的引用
1⃣️GoodStudent.h
//// GoodStudent.h// Student的Copy用法//// Created by apple on 14-3-28.// Copyright (c) 2014年 apple. All rights reserved.//#import "Student.h"@interface GoodStudent : Student@property (nonatomic, assign) int age;+(id)goodStudentWithName:(NSString *)name withAge:(int)age;@end
2⃣️GoodStudent.m
//// GoodStudent.m// Student的Copy用法//// Created by apple on 14-3-28.// Copyright (c) 2014年 apple. All rights reserved.//#import "GoodStudent.h"@implementation GoodStudent+(id)goodStudentWithName:(NSString *)name withAge:(int)age{ GoodStudent *stu = [super studentWithName:name]; stu.age = age; return stu;}-(id)copyWithZone:(NSZone *)zone{ GoodStudent *copy = [super copyWithZone:zone]; copy.age = self.age; return copy;}-(NSString *)description{ return [NSString stringWithFormat:@"%@-%i", self.name, self.age];}@end
3⃣️Student.h
//// Student.h// Student的Copy用法//// Created by apple on 14-3-28.// Copyright (c) 2014年 apple. All rights reserved.//#import@interface Student : NSObject @property (nonatomic, copy) NSString *name;+(id)studentWithName:(NSString*)name;@end
4⃣️Student.m
//// Student.m// Student的Copy用法//// Created by apple on 14-3-28.// Copyright (c) 2014年 apple. All rights reserved.//#import "Student.h"@implementation Student+(id)studentWithName:(NSString *)name{ Student *stu = [[[[self class] alloc] init] autorelease]; stu.name = name; return stu;}- (id)copyWithZone:(NSZone *)zone{ Student *copy = [[self class] allocWithZone:zone]; copy.name = self.name; return copy;}-(NSString *)description{ return [NSString stringWithFormat:@"%@", self.name];}-(void)dealloc{ [_name release]; [super dealloc];}@end
main.m
//// main.m// Student的Copy用法//// Created by apple on 14-3-28.// Copyright (c) 2014年 apple. All rights reserved.//#import#import "GoodStudent.h"void test1(){ Student *stu = [Student studentWithName:@"name1"]; Student *stu1 = [stu copy]; NSLog(@"%@", stu); NSLog(@"%@", stu1);}void test2(){ GoodStudent *stu1 = [GoodStudent goodStudentWithName:@"name1" withAge:10]; GoodStudent *stu2 = [stu1 copy]; NSLog(@"%@", stu1); NSLog(@"%@", stu2); }int main(int argc, const char * argv[]){ @autoreleasepool { test2(); } return 0;}