美文网首页
strong和 copy

strong和 copy

作者: qjsxq | 来源:发表于2020-08-16 10:28 被阅读0次
    /** <#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 最后都是生成了新的对象实现 了 深拷贝.

    相关文章

      网友评论

          本文标题:strong和 copy

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