美文网首页
OC中属性修饰符对容器的影响

OC中属性修饰符对容器的影响

作者: XXshaoyu | 来源:发表于2019-12-02 17:14 被阅读0次

    OC中用于内存管理的属性修饰符有:copy、strong、weak、assign、unsafe_unretained等等。

    对于copy、strong修饰OC中可变/不可变集合比如NSArray和NSMutableArray有什么不同呢?

    做个简单的测试

    
    @interface ArrayTest ()
    
    @property (nonatomic, copy) NSArray *arr1;
    
    @property (nonatomic, copy) NSMutableArray *arr2;
    
    @property (nonatomic, strong) NSArray *arr3;
    
    @property (nonatomic, strong) NSMutableArray *arr4;
    
    @end
    
    - (void)test{
    
        NSArray*arr =@[@1,@2,@3];
    
        self.arr1= arr;
    
        self.arr2= arr;
    
        self.arr3= arr;
    
        self.arr4= arr;
    
        // 不管用 stong/copy 修饰 NSArray/NSMutableArray 如果赋值的是一个 arr 最后都会得到一个和arr同地址的NSArray
    
        [self printInfoWithArray:arr];
    
        arr = arr.mutableCopy;
    
        // 用 copy 修饰 NSArray 如果赋值的是一个 mutableArr 会重新拷贝一份 ,得到的是一个新地址的NSArray
    
        self.arr1= arr;
    
        // 用 copy 修饰 NSMutableArray 如果赋值的是一个 mutableArr 也会重新拷贝一份 arr,得到的是一个新地址NSArray
    
        self.arr2= arr;
    
        // 用 strong 修饰 NSArray 如果赋值的是一个 mutableArr 得到的是原来的可变数组
    
        self.arr3= arr;
    
        // 用 strong 修饰 NSMutableArray 如果赋值的是一个 mutableArr 得到的是原可变数组,所以存放网络返回数据的数据源数组。大多用strong修饰
    
        self.arr4= arr;
    
        [self printInfoWithArray:arr];
    
    }
    
    - (void)printInfoWithArray:(NSArray *)arr {
    
        printf("\n====== begin ======\n");
    
        printf("arr  \t\t %s \t\t %p\n", NSStringFromClass(arr.class).UTF8String, arr);
    
        printf("arr1 \t\t %s \t\t %p\n", NSStringFromClass(self.arr1.class).UTF8String, self.arr1);
    
        printf("arr2 \t\t %s \t\t %p\n", NSStringFromClass(self.arr2.class).UTF8String, self.arr2);
    
        printf("arr3 \t\t %s \t\t %p\n", NSStringFromClass(self.arr3.class).UTF8String, self.arr3);
    
        printf("arr4 \t\t %s \t\t %p\n", NSStringFromClass(self.arr4.class).UTF8String, self.arr4);
    
        printf("====== end ======\n");
    
    }
    
    

    下面是输出结果


    _aaa.png

    综上,oc中的集合,建议使用strong修饰,尤其是可变集合,以免重新分配地址引起不必要的麻烦。

    相关文章

      网友评论

          本文标题:OC中属性修饰符对容器的影响

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