//
// Person.h
// 复制对象之深浅拷贝
//
// Created by on 14-10-27.
// Copyright (c) 2014年 Apple. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject<NSCopying>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, retain) NSNumber *age;
@end
//
// Person.m
// 复制对象之深浅拷贝
//
// Created by on 14-10-27.
// Copyright (c) 2014年 Apple. All rights reserved.
//
#import "Person.h"
@implementation Person
- (id)copyWithZone:(NSZone *)zone {
/**********深浅拷贝的不同在于实现copyWithZone的不同***********/
/******* 浅拷贝 ********/
// Person *person = [[[self class] allocWithZone:zone] init];
// person.name = _name;
// person.age = _age;
// return person;
/******* 深拷贝 ********/
// 这里发现name和age还是相同的地址
// 因为不可变的对象copy相当于return
// 当用mutableCopy时候就发现地址不同了
// 这里用copy实现深拷贝的话,需要让name和age分别实现NSCopying中的方法,就和实现Person的allocWithZone相同
Person *person = [[[self class] allocWithZone:zone] init];
person.name = [_name copy];
person.age = [_age copy];
return person;
}
@end
//
// main.m
// 复制对象之深浅拷贝
//
// Created by on 14-10-27.
// Copyright (c) 2014年 Apple. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *person = [[Person alloc] init];
person.name = @"jack";
person.age = @22;
Person *person2 = [person copy];
NSLog(@"person的地址: %p, person2的地址: %p", person, person2);
NSLog(@"arg的地址: %p, arg2的地址: %p", person.age, person2.age);
NSLog(@"name的地址: %p, name2的地址: %p", person.name, person2.name);
}
return 0;
}