OC基础-copy & mutableCopy

2016-08-18  本文已影响92人  yanhooIT

按方法区分

按拷贝深度区分

copy_1.png

容器对象(如:NSArray)复制

 NSArray *array = @[[NSMutableString stringWithFormat:@"1"], @"2",@"3"];
 NSMutableArray *mutableCopy = [array mutableCopy];
// 归档实现容器元素的内容拷贝
 NSArray *trueCopy = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:array]];
 NSMutableString *mutableStr = [array firstObject];
 [mutableStr appendString:@"abc"];
    
 NSLog(@"%@,%@,%@", array, mutableCopy, trueCopy);
2016-08-22 21:14:19.393 test[12116:860794] (
    1abc,
    2,
    3
),(
    1abc,
    2,
    3
),(
    1,
    2,
    3
)

自定义对象实现拷贝功能

实现步骤

// zone参数是系统分配的一块内存空间
- (id)copyWithZone:(NSZone *)zone;
// zone参数是系统分配的一块内存空间
// 调用allocWithZone产生一个新对象
- (id)mutableCopyWithZone:(NSZone *)zone;

NSObject有两个方法

// 此方法内部会调用copyWithZone:方法
// 注意:如果是自定义对象调用copy功能的话必须实现<NSCopying>协议,否则会报未实现方法的错误
- (id)copy;

// 此方法内部会调用mutableCopyWithZone:方法
// 注意点同上
- (id)mutableCopy;

代码示例

@interface Person() <NSCopying>

@end

@implementation Person

// 注意这里使用allocWithZone将对象拷贝这个内存空间中
- (id)copyWithZone:(NSZone *)zone
{
    // 注意这句的写法
    Person *person = [[Person allocWithZone:zone] init];
    person.age = self.age;
    person.money = self.money;
    return person;
}

@end

copy和property

总结

面试题,以下写法有什么问题?

@property (nonatomic, copy) NSMutableString *str;
@property (nonatomic, copy) NSMutableArray *array;
@property (nonatomic, strong) NSMutableString *str;
@property (nonatomic, strong) NSMutableArray *array;
上一篇下一篇

猜你喜欢

热点阅读