转载请注明:http://www.cnblogs.com/letougaozao/p/3631105.html
- 概念
- 内存管理
- 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. // #import <Foundation/Foundation.h> void 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 <Foundation/Foundation.h> @interface Student : NSObject <NSCopying> @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 <Foundation/Foundation.h> #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; }