OC深复制和浅复制

来源:互联网 发布:特别搞笑的网络歌曲 编辑:程序博客网 时间:2024/05/19 14:40

//拷贝设计的原则:保证原来的对象不会被改变
//深复制(深拷贝):产生了新的对象,
//举例1:NSMutableString可变对象不管使用copy或者是mutableCopy都会产生新的对象
//举例2:NSString不可变对象,使用mutableCopy会产生新的对象,使用copy不会产生新的对象
//总结:只有不可变对象使用copy才不会产生新的对象,其他都会产生新的对象;也即只要带有 mutable的都会会产生新的对象
//浅复制(浅拷贝):没产生新的对象,只是产生一个新的指针指向原来的内存
//注意:要使用copy和mutableCopy需要实现NSCoping协议

//浅拷贝:不可变对象使用copy(不可变拷贝),不会产生新的对象
//深拷贝:浅拷贝剩下的情况:带有mutable
//拷贝之后是否可变:只有 可变的对象的可变拷贝
//NSMutableString mutableCopy
代码段:
// NSString *str1 = @”123”;
// NSLog(@”str1 = %p”,str1);
//
// //(1)不可变对象的copy(指针拷贝,浅拷贝),产生的对象不可变
// NSString *str2 = [str1 copy];
// NSLog(@”str2 = %p”,str2);
//
// //(2)不可变对象的mutableCopy(mutableCopy一定会产生新的对象)会产生一个不可变的新的对象:深拷贝
//
// NSString *str3 = [str1 mutableCopy];
// NSLog(@”str3 = %p”,str3);
//
//

//2.可变对象的copy与mutableCopy    NSMutableString *mstr1 = [[NSMutableString alloc]initWithUTF8String:"abc"];    NSLog(@"mstr1 = %p",mstr1);

// //(1)可变对象的copy,也会产生新的对象,但是该对象不可变(深拷贝)
//
// NSMutableString *mstr2 = [mstr1 copy];
// NSLog(@”mstr2 = %p”,mstr2);
// //不可变字符串不能直接追加
// //[mstr2 appendString:@”123”];
//
// //isKindOfClass判断一个对象是否是参数这个类的实例及其子类的实例
// if ([mstr2 isKindOfClass:[NSMutableString class]]) {
// NSLog(@”是NSMutableString的实例!”);
// }
// else
// {
// NSLog(@”不是其实例或者其子类的实例!”);
// }

    //(2)可变对象的mutableCopy(深拷贝)产生一个可变的新的对象    NSMutableString *mstr3 = [mstr1 mutableCopy];    [mstr3 appendString:@"12345!"];    NSLog(@"str3 = %@",mstr3);
0 0