OC语法之Copy

//
//  main.m
//  coy
//
//  Created by New-World on 13-11-3.
//  Copyright (c) 2013年 Gary. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        
//        NSMutableArray *muatbleArray=[[NSMutableArray alloc] initWithObjects:@"one",@"two",@"three", nil];
//        NSMutableArray *muarray2=[muatbleArray retain];
//        [muarray2 removeLastObject];
//        NSLog(@"%@",muatbleArray);
//        NSLog(@"%ld",[muatbleArray retainCount]);
#pragma mark copy和retain的区别
        //copy是创建了一个新的对象,retain是原来的对象引用计数加一
        
//        NSMutableArray *muatbleArray=[[NSMutableArray alloc] initWithObjects:@"one",@"two",@"three", nil];
//        NSMutableArray *muarray2=[muatbleArray mutableCopy];
//        [muarray2 removeLastObject];
//        NSLog(@"%@",muatbleArray);
//        NSLog(@"%@",muarray2);
//        NSLog(@"%ld",[muatbleArray retainCount]);
#pragma mark copy和mutablecopy的区别
//        //copy是返回了一个不可变对象副本,mutablecopy是返回了一个可变对象副本
//        NSArray *array=[NSArray arrayWithObjects:@"1",@"2",@"3",nil];
//        NSArray *arraycopy=[array copy];
//        NSMutableArray *mutablearray=[array mutableCopy];
//        [muatbleArray addObject:@"4"];//muatbleArray可变数组方法,arraycopy无此方法
//        NSLog(@"arraycopy %@",arraycopy);
//        NSLog(@"mutablearray %@",mutablearray);
#pragma mark 深拷贝和浅拷贝的区别
        
        //浅拷贝只复制对象本身,深拷贝不仅复制对象本身,对象的属性也会被复制
        //Foundation框架中支持复制的类,默认是浅复制
        
        
        //一个数组包含了许多对象,复制一个数组的副本,那么数组元素是没复制的,指向的还是同一个对象
        NSMutableArray *array1=[[NSMutableArray alloc] initWithCapacity:3];
        for (int i=0; i<3; i++) {
            NSObject *obj=[[NSObject alloc] init];
            [array1 addObject:obj];
            [obj release];
        }
        
        for (NSObject *o in array1 ) {
            NSLog(@"array1指针地址%p :reatainCount:%lu",o,[o retainCount]);
        }
        
        NSArray *newArray=[array1 copy];
        
        for (NSObject *o in newArray) {
            NSLog(@"newArray指针地址%p :reatainCount:%lu",o,[o retainCount]);
        }
        [newArray release];
        [array1 release];
#pragma mark 自定义拷贝
        //自定义拷贝必须遵守NSCopying和NSMutableCopying协议,实现copywithZone方法
//        -(id)copyWithZone:(NSZone *)zone{
//            /**********浅拷贝************/
//            Person *person =[[[self class] allocWithZone:zone] init];
//            person.name=_name;
//            person.age=_age;
//            return person;
//            
//            /**********深拷贝************/
//            Person *person =[[[self class] allocWithZone:zone] init];
//            person.name=[_name copy];
//            person.age=[_age copy];
//            return person;
//        }
        
        //Foundation可复制的对象,当我们Copy(不是mutableCopy)的是一个不可变的对象时,它的作用相当于retain
        //三点必要条件:1.它是Founddation对象2.它是不可变对象3.进行Copy操作
        NSArray *arraya=[[NSArray alloc] initWithObjects:@"1",@"2",@"q", nil];
        NSArray *arrayb=[arraya copy];
        NSLog(@"数组一地址%p,%lu",arraya, arraya.retainCount);
        NSLog(@"数组二地址%p,%lu",arrayb, arrayb.retainCount);
        
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值