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)
浅析ObjectiveC 深浅拷贝学习
对于非容器类对象,有:
如果对一个不可变对象复制,copy是对象复制,即浅拷贝;而mutableCopy则是指针复制,即深拷贝。(示例1)《懒得起名修改,原文此处有错》
如果是对可变对象复制,都是深拷贝,但copy复制返回的对象是不可变的。(示例2)
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很好
@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]];
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];
NSMutableDictionary *allNamesCopy = [self.allNames mutableDeepCopy];
self.names = allNamesCopy;
[allNamesCopy release];