美文网首页
数组的修饰符

数组的修饰符

作者: 郭小弟 | 来源:发表于2017-01-13 15:20 被阅读62次

个人理解,只为加深印象,有疑问可留言进行交流,谢谢大家!!
我一直习惯用strong来修饰NSArray,好多同事也是如此,网上还有很多人说除了NSString用copy,其他对象类型都用strong。但是大家有没有考虑过当用strong修饰NSArray的时候,如果遇到用可变数组给它赋值怎么办?

@property (nonatomic ,strong)NSMutableArray *marray;
@property (nonatomic ,strong)NSArray *array;
//执行如下代码
    self.marray = [NSMutableArray arrayWithObjects:@1, nil];
    self.array = [NSArray array];
    self.array = self.marray;
    [self.marray addObject:@2];
    NSLog(@"%@",self.marray);
    NSLog(@"%@",self.array);

运行结果如下:

2017-01-13 14:40:47.384 copy使用[13866:1061182] self.marray = (
    1,
    2
)
2017-01-13 14:40:47.386 copy使用[13866:1061182] self.array = (
    1,
    2
)

也就是说,self.array在没有被直接操作的情况下,跟着self.mutableArray 变化了,这是很危险的。

如果把self.array用copy修饰的话:

@property (nonatomic ,copy)NSArray *array;

运行结果如下:

2017-01-13 14:43:45.291 copy使用[13909:1062768] self.marray = (
    1,
    2
)
2017-01-13 14:43:45.292 copy使用[13909:1062768] self.array = (
    1
)

这次self.array不会跟随self.mutableArray 变化了。

使用copy修饰对象,会重新开辟一片新的内存,内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。所以再次修改self.mutableArray的时候self.array是不受影响的

如果可变数组给可变数组赋值的情况下,用copy修饰就会出现崩溃

@property (nonatomic ,copy)NSMutableArray *marray;
@property (nonatomic ,copy)NSMutableArray *mutableArray;
//修饰可变数组要用strong,如果用copy修饰会出现莫名的崩溃
    self.mutableArray = [NSMutableArray arrayWithObjects:@1,@2, nil];
    
    self.marray = self.mutableArray;
    
    NSLog(@"self.marray = %@",self.marray);
    NSLog(@"self.mutableArray = %@",self.mutableArray);
    
    [self.marray removeObjectAtIndex:0];

运行结果

[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x608000029e80

如果换成strong修饰就ok了

@property (nonatomic ,strong)NSMutableArray *marray;
@property (nonatomic ,strong)NSMutableArray *mutableArray;
self.marray = (
    1,
    2
)
2017-01-13 15:09:49.834 copy使用[14265:1076860] self.mutableArray = (
    1,
    2
)

个人觉得,如果用copy修饰可变数组的话,因为对这个数组进行了增删改操作,而copy后的数组变成了不可变数组

相关文章

  • mongodb更新运算符

    字段 数组 修饰符 按位

  • java学习-1

    数组 运算符 包 访问权限 修饰符 数组 1. 数组的声明: int[] a; 2. 数组的创建 使用new运算符...

  • Swift学习 -- 数组

    Swift中的数组,能存放不同类型的元素。 1.定义 不可变数组 用let修饰符修饰的数组,就是不可变数组。例子:...

  • 数组的修饰符

    个人理解,只为加深印象,有疑问可留言进行交流,谢谢大家!!我一直习惯用strong来修饰NSArray,好多同事也...

  • 获取mobx 5之前获取数组数据

    获取mobx中的数组数据 mobx 5之前版本中如果将数组作为可观察, 可以通过添加修饰符@observable或...

  • 1. 数据类型

    修饰符 数据类型 字符串(String) 哈希表(Object) 数组(Array) 数字(Number) 布尔(...

  • Kotlin--学习总结

    声明对象 数组和集合 函数 类 构造函数 继承 抽象类 object 接口 导入包 可见修饰符 空安全 for循环...

  • 谈谈 OC 属性修饰符的本质是什么!

    属性修饰符的本质 assign 修饰符 copy 修饰符 atomic 修饰符 strong 修饰符 weak 修...

  • Kotlin 关键字、修饰符、操作符

    Kotlin中的修饰符关键字分类 类修饰符 成员修饰符 访问权限修饰符 协变逆变修饰符 函数修饰符 属性修饰符 参...

  • vue 常见修饰符

    表单修饰符 事件修饰符 鼠标修饰符 键盘修饰符

网友评论

      本文标题:数组的修饰符

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