Object-C 学习笔记(二十四)--- 自定义拷贝

本文介绍Objective-C中实现深拷贝与浅拷贝的方法,包括自定义拷贝通过实现NSCopying协议,以及如何正确处理属性拷贝以避免内存管理问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义拷贝:实现NSCopying协议,覆盖

- (id)copyWithZone:(NSZone *)zone 方法


属性拷贝:当copy修饰可变对象时,则为深拷贝需要注意内存管理;修饰不可变对象时,则为浅拷贝.


实例:

//
//  Person.h
//  DefineCopying
//
//  Created by 5016 on 13-12-16.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject<NSCopying>//实现copying协议(接口)

@property(retain,nonatomic)NSString* name;
@property(assign,nonatomic)NSInteger age;
//属性copy
@property(copy,nonatomic)NSArray *array;
@property(copy,nonatomic)NSMutableArray *marray;

-(Person *)initWithName:(NSString*)name andAge:(NSInteger)age;

@end

//
//  Person.m
//  DefineCopying
//
//  Created by 5016 on 13-12-16.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import "Person.h"

@implementation Person

@synthesize name = _name,age = _age;
//属性copy
@synthesize array = _array,marray = _marray;

-(Person *)initWithName:(NSString*)name andAge:(NSInteger)age
{
    if (self = [super init]) {
        _name = name;
        _age = age;
    }
    return self;
}

/*
 *实现协议(接口)的copy==>自定义copy
 *实现NScoping的协议内容,让自定义的类拥有copy方法,当对象调用copy方法时,该方法会执行
 */
- (id)copyWithZone:(NSZone *)zone
{
    //写法1
//    Person *per = [[Person alloc] init];
//    if (self = [super init]) {
//        per.name = self.name;
//        per.age = self.age;
//    }
//    return [per autorelease];
    
    //写法2
    Person *per = [[[self class]allocWithZone:zone]init];
    per.name = [_name copy];
    per.age = _age;
    return per;
}

-(void)dealloc
{
    [_name release];
    [_array release];//使用retain或者copy的对象,都需要再dealloc方法中释放一次
    [_marray release];
    
    [super dealloc];
}

@end

//
//  main.m
//  DefineCopying
//
//  Created by 5016 on 13-12-16.
//  Copyright (c) 2013年 dradon. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"

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

    @autoreleasepool {
   
        //1.自定义copy,深copy
        NSLog(@"========自定义copy,覆盖协议(接口)方法,自动拷贝,属于深copy=======");
        Person *p1 = [[Person alloc] initWithName:@"dragon" andAge:23];
        Person *p2 = [p1 copy];
        NSLog(@"p1=%p",p1);
        NSLog(@"p2=%p",p2);
        NSLog(@"p1的名字为%@,p1的年龄为%ld",p1.name,p1.age);
        NSLog(@"p2的名字为%@,p2的年龄为%ld",p2.name,p2.age);
        
        //2.属性copy
        //当copy修饰不可变属性是,就相当于retain,只是引用计数加一,当copy修饰可变属性时,就和retain不同了,copy出来的对象会是深copy,要注意内存管理
        //属性:不可变对象,浅copy
        NSLog(@"========属性:不可变对象,浅copy=======");
        NSArray *array=[[NSArray alloc]initWithObjects:@"iphone",@"ipad",@"android" ,nil];
        NSLog(@"array的引用计数为%ld",[array retainCount]);
        p1.array=array;//copy了//2
        NSLog(@"array的引用计数为%ld",[array retainCount]);
        NSLog(@"array的地址为%p",array);
        [array release];//1
        NSLog(@"p1.array的引用计数为%ld",[p1.array retainCount]);
        NSLog(@"p1.array的地址为%p",p1.array);
        [p1.array release];//0
        NSLog(@"p1.array的引用计数为%ld",[p1.array retainCount]);
       // NSLog(@"array的引用计数为%ld",[array retainCount]);
       
        
        
        //属性:可变对象,深拷贝
        NSLog(@"========属性:可变对象,深拷贝=======");
        NSMutableArray *marray=[[NSMutableArray alloc]initWithObjects:@"1",@"2",@"3", nil];
        p1.marray=marray;
        NSLog(@"marray的引用计数为%ld",[marray retainCount]);
        NSLog(@"marray的地址为%p",marray );
        NSLog(@"p1.marray的引用计数为%ld",[p1.marray retainCount]);
        NSLog(@"p1.marray的地址为%p",p1.marray);
        [marray release];
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值