美文网首页iOS
OC由浅入深系列 之 深浅拷贝

OC由浅入深系列 之 深浅拷贝

作者: SimonMont | 来源:发表于2019-02-24 22:10 被阅读46次
    一、什么是深拷贝,浅拷贝?

    在堆中产生一个副本的拷贝操作称为深拷贝,在栈中声名一个指针指向对象的堆地址称为浅拷贝。

    image.png image.png
    二、集合的什么拷贝
      1、可变集合copy之后产生新的不可变集合:深拷贝,集合元素为浅拷贝。
    
      2、可变集合mutablecopy之后产生新的可变集合:深拷贝,集合元素为浅拷贝
    
      3、不可变集合copy之后没有产生新集合:浅拷贝,集合元素为浅拷贝
    
      4、不可变集合mutablecopy之后产生新的可变集合:深拷贝,集合元素为浅拷贝
    
    三、NSString 和 NSMutbleString
      1、NSString copy 为浅拷贝
    
      2、NSString mutableCopy为深拷贝,产生新的可变对象
    
      3、NSMutableString copy为深拷贝,产生新的不可变对象
    
      4、NSMutableString mutableCopy 为深拷贝,产生新的可变对象
    
    四、规律
      1、copy:对于可变对象为深拷贝,对于不可变对象为浅拷贝
    
      2、mutableCopy:始终未深拷贝
    
    五、面试考点

    1、深浅拷贝的区别?NSString *str = xxx; copy之后的结果是?

    答:略(从上面知识点总结即可)

    2、如何让所有的对象具备拷贝能力?

    答:定义一个公共父类,实现NSCopying和 NSMutableCopying协议,然后利用运行时获取对象所有的成员变量,赋值操作。如下:

    #import "SMModel.h"
    
    #import <objc/runtime.h>
    
    @implementation SMModel
    
    - (id)copyWithZone:(NSZone *)zone {
    
        SMModel *obj = [[[self class] alloc] init];
    
        unsigned int outCount = 0;
    
        Ivar* list = class_copyIvarList([self class], &outCount);
    
        for (unsigned int i = 0; i < outCount; i++) {
    
            const char *name = ivar_getName(list[i]);
    
            NSString *key = [NSString stringWithUTF8String:name];
    
            [obj setValue:[self valueForKey:key] forKey:key];
    
        }
    
        return obj;
    
    }
    
    - (id)mutableCopyWithZone:(NSZone *)zone {
    
        SMModel *obj = [[[self class] alloc] init];
    
        unsigned int outCount = 0;
    
        Ivar* list = class_copyIvarList([self class], &outCount);
    
        for (unsigned int i = 0; i < outCount; i++) {
    
            const char *name = ivar_getName(list[i]);
    
            NSString *key = [NSString stringWithUTF8String:name];
    
            [obj setValue:[self valueForKey:key] forKey:key];
    
        }
    
        return obj;
    
    }
    
    @end
    

    3、一个NSMutableArray的对象array1(地址为0x100)包含一个NSString类型的对象str(地址为0x200),执行 array2 = [array1 copy];str2 = array2[0]之后,str2的地址和str1地址相等吗? 如果是mutableCopy呢?

    答:都相等(原因看上文)

    相关文章

      网友评论

        本文标题:OC由浅入深系列 之 深浅拷贝

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