copy,mutableCopy 理解(2)
来源:未知 责任编辑:责任编辑 发表时间:2013-12-18 11:33 点击:次
p>[NSMutableArray mutableCopy] 同上。
p>
p>NSMutableArray *srcMArray = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"MArray"],@"b",@"c",nil];
p>NSMutableArray *mArrMCopy = [srcMArray mutableCopy];
p>NSArray *mArrayCopr = [srcMArray copy];
p>(lldb)p srcMArray
p>
p>(NSMutableArray *) $3 = 0x0ce70100 @"3 objects"
p>
p>(lldb) p mArrMCopy
p>
p>(NSMutableArray *) $4 = 0x0cf667e0 @"3 objects"
p>
p>(lldb)p mArrayCopr
p>
p>(NSArray *) $5 = 0x0cd82a50 @"3 objects”
p>
p>
p>
p>再说下array里面的对象的问题。前面都提到,不论是NSArray还是NSMutableArray,他们的mutableCopy或者copy返回的对象里面所包含的对象的地址都是一样的,也就是说,里面包含的对象都是指针复制。我这里不能直观的打出array里对象的地址,可以做个测试。
p>NSString *srcObj1 = [arrCopyobjectAtIndex:0];
p>[srcObj1 appendString:@"IOS7"];
p>
p>NSMutableString *srcObj2 = [arrCopyobjectAtIndex:0];
p>
p>NSString *srcObj3 = [arrCopyobjectAtIndex:1];
p>
p>(lldb)po srcArray
p>
p><__NSArrayI 0xce6fdc0>( aIOS7, sss, c )
p>
p>(lldb)po arrCopy
p>
p><__NSArrayI 0xce6fdc0>( aIOS7, sss, c )
p>
p>(lldb)po arrMCopy
p>
p><__NSArrayM 0xcf6e1e0>( aIOS7, sss, c
p>
p>)
p>NSArray 的copy 返回的对象,只要修改其包含对象的的内容(前提是该对象可以修改),mutableCopy返回的对象里面的该对象内容也发生了变化。
p>再附上该对象的内存结构:
p>(lldb)p srcObj1
p>
p>(NSString *) $8 = 0x0cd92020 @"aIOS7"
p>
p>(lldb)p srcObj2
p>
p>(NSMutableString *) $9 = 0x0cd92020 @“aIOS7"
p>
p>(lldb)p *srcObj1
p>
p>(NSString) $5 = { NSObject = { isa = __NSCFString } }
p>
p>(lldb)p *srcObj2
p>
p>(NSMutableString) $6 = { NSString = { NSObject = { isa = __NSCFString } } }
p>
p>(lldb)p *srcObj3
p>
p>(NSString) $7 = { NSObject = { isa = __NSCFString }
p>
p>}
p>
p>NSMutableArray 的copy 和mutableCopy可以自己证明下。
p>总结:
p>1:对于不可变对象,copy都是浅复制,即指针复制。mutableCopy 都是Alloc一个新对象返回。
p>2:对于可变对象,copy和mutableCopy都是Alloc新对象返回。
p>3:不论是可变还是不可变对象,copy返回的对象都是不可变的,mutableCopy返回的对象都是可变的。
p>4:容器类对象,不论是可变的还是不可变的,copy,mutableCopy返回的对象里所包含的对象的地址和之前都是一样 的,即容器内对象都是浅拷贝。
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>