【Object-C】Copy


Returns a new instance that’s a copy of the receiver. (required)
Returns the object returned by mutableCopyWithZone: where the zone is nil.

Declaration:
- (id)copyWithZone:(NSZone *)zone
- (id)mutableCopy

簡單的說,copy方法用於複製對象的副本,並返回對象的不可變副本(即使對象本身可變)。
mutablecopy方法則用於複製對象的可變副本,總是返回對象的可變副本(即使被複制對象的本身是不可變的)。
當程序對複製的原對象副本進行修改時,原對象不會受到影響。
//
//  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;
       
//輸出p1p2及其屬性
       
NSLog(@"實例對象p1:%@,p1的副p2:%@, %i,%i",p1,p2,p1.age,p2.age);
       
       
//分別用alloccopyretain方法創建對象。
       
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;
}

#import "People.h"
@implementation People

-(
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.882 NeuCopy[3013:303] 實例對象p1:<People: 0x100102300>,p1的副p2:<People: 0x100102300>, 32,32
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
Program ended with exit code: 0

發佈了55 篇原創文章 · 獲贊 86 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章