美文网首页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由浅入深系列 之 深浅拷贝

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

  • OC由浅入深系列 之 属性

    一、什么是属性 在OC中,用@property 关键字修饰的类的成员成为属性。 在属性出现之前,声名一个实例变量通...

  • OC中的深浅拷贝

    我们从3种类型的对象来分析一下OC的深浅拷贝 系统非容器类型的对象(以string来举例) 不可变类型 NSStr...

  • Copy基础理解(一)

    关于oc深浅拷贝问题可能做过ios开发的都有了解到,尤其是面试特别喜欢问深浅拷贝的问题.但大多有点误区,即便是有几...

  • Copy & MutableCopy

    copy&mutableCopy介绍   copy和mutableCopy,深浅拷贝,在OC里面是两个协议方法NS...

  • 2018-08-29

    深浅拷贝 1.根据拷贝内容的不同,分为深浅拷贝 深拷贝:内容...

  • iOS之深浅拷贝

    1.深拷贝和浅拷贝概念 由上面的图我们可以明确地看出:浅拷贝(Shallow copy):是指针复制,它们指向共同...

  • JS之深浅拷贝

    1.深拷贝与浅拷贝的区别 如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,...

  • Java之深浅拷贝

    Java之深浅拷贝 基本类型:拷贝数据的值其他类型:拷贝地址的引用,拷贝出的新对象与原对象共享实例变量,不受访问权...

  • iOS 之深浅拷贝

    1. 深浅copy的本质区别: 深copy: 在拷贝对象自身的时候,将底层数据也进行了复制过去。 浅copy: 只...

网友评论

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

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