美文网首页
【那些年我们遇到的坑】可变容器类属性copy问题

【那些年我们遇到的坑】可变容器类属性copy问题

作者: 修羅童鞋 | 来源:发表于2017-08-26 22:24 被阅读0次

你肯定看到、写过或遇到过这种代码

@property (nonatomic, copy) NSMutableArray *arrayCopy

写一下问题代码:

@interface MyObject : NSObject

@property(nonatomic, copy) NSMutableArray *arrayCopy;
@property(nonatomic, strong) NSMutableArray *arrayStrong;

@end

@implementation MyObject

- (void)practice {
  // ...Test...
}

@end

网络上很多都会说,如果你写了copy属性的NSMutableArray,当你进行增删改的时候,就会报错:

[__NSArray0 addObject:]: unrecognized selector sent to instance 0x100202290

这个错误,是因为copy修饰的属性,在调用增删改的时候,会进行copy操作,而copy操作得到的是一个不可变变量,即NSArray。

NSMutableArray *a = [NSMutableArray new];
NSLog(@"%@->%@", [a class], [[a copy] class]);
// __NSArrayM->__NSArray0

也肯定有人说,MD,老子怎么用,都没报错啊!!!
没错,你不是没报错,你只是对于成员变量的使用没有选择正确的方式,所以,你才会非常巧的没有报错!

看接下来两个实现:


- (void)practice {
    self.arrayCopy = [[NSMutableArray alloc] init];
    [self.arrayCopy addObject:@"copy1"];
}


- (void)practice {
    _arrayCopy = [[NSMutableArray alloc] init];
   [self.arrayCopy addObject:@"copy1"];
}

发现不同了吗?没错,第一个是会报错的代码,而第二个是不会报错的。为什么呢?因为第二个没有使用self.的调用,也就是没有调用arrayCopy成员变量的set方法,而只是单纯的赋值给了它,这种情况下,是不会调用copy方法的,因此,你并没有触发copy的报错!

因此,建议进行变量调用赋值时,尽可能使用self.的形式,而且对于可变容器类,一定不要使用copy属性,防止错误的发生!

相关文章

  • 【那些年我们遇到的坑】可变容器类属性copy问题

    你肯定看到、写过或遇到过这种代码 @property (nonatomic, copy) NSMutableArr...

  • iOS 容器的浅拷贝和深拷贝

    1.不可变容器 不可变容器的copy是浅拷贝,mutableCopy为深拷贝 2.可变容器 可变容器的copy和m...

  • copy

    /** 一.系统非容器类对象1.对不可变对象复制:copy是指针复制、mutableCopy是对象复制2.可变对象...

  • 深入理解深浅拷贝

    再次深入探究了深浅拷贝的东西。非容器类和容器类的深浅拷贝大致相似,不可变类型的copy拷贝是浅拷贝,mutable...

  • 关于 Objective-C 中的 copy

    通常, 我们在定义 不可变字符串和不可变集合 的时候, 会用到 copy 这个存储属性, 那我们为何要用 copy...

  • 深拷贝浅拷贝要点笔记

    不可变对象&容器: 【str copy】【arr copy】浅拷贝 【str mutablecopy】【arr m...

  • iOS-copy&&strong

    可变属性用strong,不可变属性用copy 当源字符串是NSMutableString时,strong属性只是增...

  • iOS Copy 与 MutableCopy

    用不可变容器类创建的对象 进行的copy 是指针复制,没有创建对象,进行的mutableCopy不再是地址拷贝,是...

  • Copy

    一:非容器类 1.copy: 返回一个不可变对象。分两种情况: (1)若原对象是不可变对象,那么返回原对象,并将其...

  • iOS中几个小知识点整理

    一、NSString用copy还是strong 首先看下copy修饰可变变量与不可变变量的区别: 同理,属性NSS...

网友评论

      本文标题:【那些年我们遇到的坑】可变容器类属性copy问题

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