// main.m
// NeuCopy
//
// Created by mac on 14-12-1.
// Copyright (c) 2014年 mac. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "People.h"
#import "Dog.h"
#import "GoodPeople.h"
/*
copy 意義對於非可變對象來說,並不是產生新的對象,
而對於可變對象來說,是產生一個新的對象
multablecopy
對於非可變對象的話,也是產生一個可變對象,
對於可變對象來說,自然也是產生一個可變對象
*/
int main(int argc, const char * argv[]) {
@autoreleasepool {
//用alloc方法新建一個p1對象
People * p1 = [[People alloc]init];
p1.age = 45;//設置age屬性
//使用copy方法複製p2對象
People * p2 = [p1 copy];
p2.age = 32;
//輸出p1,p2及其屬性
NSLog(@"實例對象p1:%@,p1的副p2:%@, %i,%i",p1,p2,p1.age,p2.age);
//分別用alloc、copy、retain方法創建對象。
Dog * dog1 = [[Dog alloc]initWithColor:4];
Dog * dog2 = [dog1 copy];
Dog * dog3 = [dog1 retain];
//查看對象返回值
NSLog(@"%@ ,%@ , %@ ,%i, %i",dog1,dog2,dog3,dog1.color,dog2.color);
Dog * dog = [[Dog alloc]init];
GoodPeople * gp = [[GoodPeople alloc]init];
gp.dog = dog;
GoodPeople * gp1 = [gp copy];
NSLog(@"dog:%@, gp:%@, gp1:%@",dog,gp.dog,gp1.dog);
gp1.sex = 0;
//釋放內存
[dog release];
[gp release];
[gp1 release];
[p1 release];
[p2 release];
}
return 0;
-(id)copyWithZone:(NSZone *)zone
{
//深拷貝,爲copy副本申請新的內存空間
// People *p = [[self class] allocWithZone:zone];
//
// p.age = self.age;
//
// return p;
//淺拷貝,將copy副本的self指針指向原對象的內存地址,原對象和副本地址將會是同一個
return [self retain];
}
@end
2014-12-01 18:32:22.884 NeuCopy[3013:303] <Dog: 0x1006013b0> ,<Dog: 0x100602290> , <Dog: 0x1006013b0> ,4, 4
2014-12-01 18:32:22.885 NeuCopy[3013:303] dog:<Dog: 0x10010a050>, gp:<Dog: 0x10010bac0>, gp1:<Dog: 0x10010bac0>
2014-12-01 18:32:22.886 NeuCopy[3013:303] dog is releaseing
2014-12-01 18:32:22.886 NeuCopy[3013:303] dog is releaseing