How to copy an object in objective c

How to copy an object in objective c

补补基础

    NSMutableArray *dataArray=[NSMutableArrayarrayWithObjects:@"one",@"two",@"three",@"four",nil];

    NSMutableArray *dataArray2;

    dataArray2=[dataArray copy];

    NSLog(@"%p,%p",dataArray,dataArray2);

    //2012-09-01 14:37:36.480 Problems[466:f803] 0x6879370,0x6883160


copy结果尽然是一个新的指针,我表示我2了



   

    NSMutableArray *dataArray=[NSMutableArrayarrayWithObjects:

                               [NSMutableStringstringWithString:@"one"],

                               [NSMutableStringstringWithString:@"two"],

                               [NSMutableStringstringWithString:@"three"],

                               nil];

    NSMutableArray *dataArray2;


    dataArray2 =[dataArray mutableCopy];

    NSMutableString *mStr=[dataArray objectAtIndex:0];

    NSMutableString *mStr2=[dataArray2 objectAtIndex:0];

    NSLog(@"%p,%p",mStr,mStr2);

    [mStr appendString:@"ONE"];

    

    NSLog(@"%@,%@",dataArray,dataArray2);

    [dataArray2 release];

//    2012-09-01 15:03:29.324 Problems[534:f803] 0x6c4f840,0x6c4f840

//    2012-09-01 15:04:15.155 Problems[534:f803] (

//                                                oneONE,

//                                                two,

//                                                three

//                                                ),(

//                                                   oneONE,

//                                                   two,

//                                                   three

//                                                   )

//

//    (lldb) p dataArray

//    (NSMutableArray *) $22 = 0x06c5c070

//    (lldb) p dataArray2

//    (NSMutableArray *) $23 = 0x06c5be50

//    (lldb) 

这里array里面的子元素,尽然是同一个地址,晕啊。
书上的解释是:这与默认的浅复制方式有关,在内存中为新的数组对象分配了空间(所以我可以打出不同的地址)
仅将每个元素的引用从一个数组复制到了另一个数组,。
结果:两个数组中的元素都指向内存中的同一个字符串。
将一个对象赋值给另一个对象没什么不同(我试试把copy 改成=,还是有点区别的,果然,至少,新的数组对象有了新的空间)


算了,我也不废话了,还是看看这篇吧
http://mobile.51cto.com/iphone-267060.htm

浅析ObjectiveC 深浅拷贝学习



对于非容器类对象,有:

如果对一个不可变对象复制,copy是对象复制,即浅拷贝;而mutableCopy则是指针复制,即深拷贝。(示例1)《懒得起名修改,原文此处有错》

如果是对可变对象复制,都是深拷贝,但copy复制返回的对象是不可变的。(示例2)




举个例子,[[array objectAtIndex:0]appendstring:@”sd”]后其他的容器内对象并不会受影响。[[array objectAtIndex:1]和[[deepCopyArray


objectAtIndex:0]尽管是指向同一块内存,但是我们没有办法对其进行修改——因为它是不可改变的。所以指针复制已经足够。所以这并不是完全意义上的深拷贝。


问题1:这里应该是[[deepCopyArrayobjectAtIndex:0] 这里的0应该是1吧。
问题2:    8 #import <foundation /Foundation.h> 
    @interface NSDictionary(MutableDeepCopy)  
    - (NSMutableDictionary *)mutableDeepCopy;  
    @end  
    </foundation> 
    NSDictionaryMutableDeepCopy.m  
    #import "NSDictionaryMutableDeepCopy.h"  
    @implementation NSDictionary(MutableDeepCopy)  
    - (NSMutableDictionary *)mutableDeepCopy {  
        NSMutableDictionary *ret = [[NSMutableDictionary alloc]  
                                    initWithCapacity:[self count]];  
        NSArray *keys = [self allKeys];  
        for (id key in keys) {  
            id oneValue = [self valueForKey:key];  
            id oneCopy = nil;          
            if ([oneValue respondsToSelector:@selector(mutableDeepCopy)]) {  
                oneCopy = [oneValue mutableDeepCopy];  
            }  
            else if ([oneValue respondsToSelector:@selector(mutableCopy)]) {  
                oneCopy = [oneValue mutableCopy];  
            }  
            if (oneCopy == nil) {  
                oneCopy = [oneValue copy];  
            }  
            [ret setValue:oneCopy forKey:key];  
        }  
        return ret;  
    }  
    @end 
在这里        
if ([oneValue respondsToSelector:@selector(mutableDeepCopy)]) {  
            oneCopy = [oneValue mutableDeepCopy];  
        } 
mutableDeepCopy 这里是递归吗?这个我不是很理解


3.- (id)copyWithZone:(NSZone *)zone  
{  
         MyObj *copy = [[[self class] allocWithZone:zone] init];  
         copy->name = [name copy];  
         copy->imutableStr = [imutableStr copy];  
//       copy->name = [name copyWithZone:zone];;  
//       copy->imutableStr = [name copyWithZone:zone];//  
         copy->ageage = age;  
   
         return copy;  
}  
这里我也不理解,copy->name = [name copyWithZone:zone];;这里不也是递归吗?


里面有个url很好


现在是2012年12月4日
更新如下,此时此刻我总算明白了,容器类对象的如何实现深层的拷贝,需要自己实现一个category,

@interface NSDictionary(MutableDeepCopy)

- (NSMutableDictionary *)mutableDeepCopy;

@end


#import "NSDictionary-MutableDeepCopy.h"


@implementation NSDictionary (MutableDeepCopy)


- (NSMutableDictionary *) mutableDeepCopy {

    NSMutableDictionary *returnDict = [[NSMutableDictionary alloc]

  initWithCapacity:[self count]];

    NSArray *keys = [self allKeys];

    for (id key in keys) {

        id oneValue = [self valueForKey:key];

        id oneCopy = nil;

/*respondsToSelector:- (BOOL)respondsToSelector:(SEL)aSelectoriOS (2.0 and later)Returns a Boolean value that indicates whether the receiver implements or inherits a method that can respond to a specified message. (required)*/

        if ([oneValue respondsToSelector:@selector(mutableDeepCopy)])

            oneCopy = [oneValue mutableDeepCopy];

        else if ([oneValue respondsToSelector:@selector(mutableCopy)])

            oneCopy = [oneValue mutableCopy];

        if (oneCopy == nil)

            oneCopy = [oneValue copy];

        [returnDict setValue:oneCopy forKey:key];

        [oneCopy release];

    }

    return returnDict;

}

@end

(书的183页有句话,刚开始有点迷糊,后来明白过来了
//代码段:

//    NSMutableDictionary *returnDict = [[NSMutableDictionary alloc]

   initWithCapacity:[self count]];

你可能已经注意到这里似乎存在内存泄露。我们分配并初始化returnDict,但是从未释放它。这并没有影响,因为我们的方法名称中包含“copy”,它遵循与CopyWithZone:方法相同的内存规则,会在保留计数为1时返回一个对象。
//代码段:
//

        if ([oneValue respondsToSelector:@selector(mutableDeepCopy)])

            oneCopy = [oneValue mutableDeepCopy];

        else if ([oneValue respondsToSelector:@selector(mutableCopy)])

            oneCopy = [oneValue mutableCopy];

        if (oneCopy == nil)

            oneCopy = [oneValue copy];

        [returnDict setValue:oneCopy forKey:key];

        [oneCopy release];


另一方面,你可能已注意到我们释放了所创建的每个副本,并且怀疑我们是否过度释放了这些新对象。事实上,我们j。。。。
returnDict 是我们的方法唯一应该避免释放的对象。
应用的地方

    NSMutableDictionary *allNamesCopy = [self.allNames mutableDeepCopy];

    self.names = allNamesCopy;

    [allNamesCopy release];


如果我想在自己的类,实现copy mutablecopy方法,就需要继承 NSCopy  NSMutablecopy 协议。
并且实现CopyWithZone   MutableCopyWithZone方法,就ok了。


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值