iOS

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

2019-02-24  本文已影响46人  SimonMont
一、什么是深拷贝,浅拷贝?

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

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呢?

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

上一篇 下一篇

猜你喜欢

热点阅读