strong和 copy
2020-08-16 本文已影响0人
qjsxq
/** <#name#> */
@property (nonatomic, strong) NSArray *array1;
/** <#name#> */
@property (nonatomic, copy) NSArray *array2;
// strong。和 copy 区别
- (void)test1 {
NSMutableArray *tempArray = [[NSMutableArray alloc] initWithArray:@[@"a",@"b"]];
// 这个在set方法里面想当于, array = [tempArray copy]
//- (void)setData:(NSArray *)data
//{
// if (_data != data) {
// [_data release];
// _data = [data copy];
// }
//}
self.array1 = tempArray;
self.array2 = tempArray;
[tempArray addObject:@"c"];
// _array2 = @[@"a",@"b"]
//_array1 = @[@"a",@"b",@"c"]
}
Snip20200816_2.png
用strong 还是copy
一般NSArray 和 NSString 这种有可变子类的都用copy 修饰
https://southpeak.github.io/2015/05/10/ios-techset-1/
如果 数组中是对象的话,如何实现深拷贝
- (void)test3 {
Person *person1 = [Person new];
Person *person2 = [Person new];
NSArray *array = @[person1, person2];
NSMutableArray *muArr = [array copy];
NSMutableArray *muArray2 = [[NSMutableArray alloc] initWithArray:array];
NSMutableArray *muarray3 = [muArray2 mutableCopy];
}
上面的几种方法最后得到的数组中的对象都是同一个对象
Snip20200825_3.png
实现方法
- 第一种
@interface Person : NSObject <NSCopying>
@end
- (nonnull id)copyWithZone:(nullable NSZone *)zone {
Person *p = [Person new];
return p;
}
让数组中对象的类继承NSCopying协议,实现copyWithZone方法。
然后
NSMutableArray *muArray4 = [[NSMutableArray alloc] initWithArray:array copyItems:YES];
原理:
- (id) initWithArray: (NSArray*)array copyItems: (BOOL)shouldCopy
{
if (shouldCopy == YES)
{
NSUInteger i;
for (i = 0; i < c; i++)
{
objects[i] = [objects[i] copy];
}
return self;
}
- (id) copy
{
return [(id)self copyWithZone: NSDefaultMallocZone()];
}
// copyItems为YES时,数组中的每个对象都会调用copy方法
// 就是调用copyWithZone
- 第二种
NSArray *arr4 = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:arr]];
// Person里面要继承 NSCoding 协议 实现
- (void)encodeWithCoder:(NSCoder *)aCoder
- (instancetype)initWithCoder:(NSCoder *)aDecoder
其实两种方法最后在无论是initWithCoder 还是 copyWithZone 最后都是生成了新的对象实现 了 深拷贝.