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


二、集合的什么拷贝
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呢?
答:都相等(原因看上文)
网友评论