美文网首页
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