美文网首页iOS Development
iOS知识总结(五):深、浅拷贝

iOS知识总结(五):深、浅拷贝

作者: 里克尔梅西 | 来源:发表于2018-02-28 00:46 被阅读7次

    定义:

    • 浅拷贝:并不拷贝对象本身,仅仅是拷贝指向对象的指针
    • 深拷贝:直接拷贝整个对象内容到另一块内存中
      再简单些说:浅拷贝就是指针拷贝;深拷贝就是内容拷贝。

    copy和mutbleCopy的区分:

    在非集合类的对象中(例如NSString):

    [string copy] // 浅拷贝
    [string mutableCopy] //深拷贝
    [mutableString copy] //深拷贝
    [mutableString mutableCopy] //深拷贝

    在集合类的对象中(例如NSArray):

    [array copy] // 浅拷贝
    [array mutableCopy] //单层深拷贝
    [mutableArray copy] //单层深拷贝
    [mutableArray mutableCopy] //单层深拷贝

    这里的单层深拷贝(one-level-deep copy)是指集合对象中可能会包含指针类型的实例变量,所以值拷贝了Array,而其中的元素知识浅拷贝。

    自定义对象的拷贝

    在OC中不是所有的类都支持拷贝,只有遵循<NSCopying>才支持copy,只有遵循<NSMutableCopying>才支持mutableCopy。如果没有遵循,拷贝时会直接Crash。

    例如自定义一个Person的类:

    @interface Person : NSObject<NSCopying>
    
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) NSInteger age;
    
    @end
    

    要想实现对person的拷贝即:

    //自定义对象的复制
    - (void)testPerson {
        Person *person1 = [[Person alloc] init];
        person1.age = 20;
        person1.name = @"小李";
        
        Person *person2 = [person1 copy];
        
        NSLog(@"person1_p: %p", person1);
        NSLog(@"person2_p: %p", person2);
    }
    

    则在person中必须实现copyWithZone的方法,即:

    - (nonnull id)copyWithZone:(nullable NSZone *)zone {
        Person *person = [[[self class] allocWithZone:zone] init];
        person.name = self.name;
        person.age = self.age;
        return person;
    }
    

    否则程序会崩溃,同理NSMutableCopy也是如此。

    参考文章:
    https://www.jianshu.com/p/33f175d97b86
    https://www.jianshu.com/p/b0aa9100db16
    http://www.cocoachina.com/ios/20170314/18865.html

    相关文章

      网友评论

        本文标题:iOS知识总结(五):深、浅拷贝

        本文链接:https://www.haomeiwen.com/subject/cluvxftx.html