NSString、NSArray、Block使用Copy

1. @propery声明NSString、NSArray、NSDictionary时使用copy

  • 因为 NSString、NSArray、NSDictionary都有自己对应的NSMutableString、NSMutableArray、NSMutableDictionary,而父类指针可以指向子类对象,使用copy可以使本对象不受(子对象)影响,无论传入是一个可变的还是不可变得对象,都能保证自身持有的是一个不可变得副本
  • 使用strong,如果这个属性指向一个可变对象,修改可变对象时,这个属性值也会被修改
@property (strong, nonatomic) NSArray *array;

 NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"a",@"b", nil];
self.array = mArray;
[mArray  addObject:@"c"];
NSLog(@"%@",self.array);
//输出 abc
@property (strong, nonatomic) NSArray *array;
//输出 ab
array没有被修改,copy能保证属性不被子类对象被修改时一同被修改

2 拷贝

  • 深拷贝:拷贝出来的对象与原对象地址不一致,修改拷贝对象的值对源对象的值没有任何影响。 深拷贝是直接拷贝整个对象内容到另一块内存中
  • 浅拷贝:拷贝出来的对象与原对象地址一致,修改拷贝对象的值会直接影响源对象的值

浅复制就是指针拷贝;深复制就是内容拷贝
集合对象的深拷贝只是对象本身,而集合对象的元素还是地址的拷贝,即单层深拷贝:

3 block为什么要使用copy

@property (copy) void (^btnBlock)(NSString * str);

使用copy修饰block其实是从MRC遗留下来的,在MRC时期,作为全局变量的block在初始化时是被存放在栈区的,这样在使用时如果block内有调用外部变量,那么block无法保留其内存,如果在出了block的初始化作用域内使用,就会引起崩溃,使用copy可以将block的内存推入堆中,这样让其拥有保存调用的外部变量的内存的能力。

在ARC下,对NSStackBLock用strong进行强引用的话,好像会自动对其进行copy一份,变成NSMallocBLock,所以不会crash。在ARC下,其实不使用copy修饰block也是可以的。

你可能感兴趣的:(NSString、NSArray、Block使用Copy)