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 最后都是生成了新的对象实现 了 深拷贝.

上一篇下一篇

猜你喜欢

热点阅读