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;
[mArrayaddObject:@"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的内存推入堆中,这样让其拥有保存调用的外部变量的内存的能力。
【NSString、NSArray、Block使用Copy】在ARC下,对NSStackBLock用strong进行强引用的话,好像会自动对其进行copy一份,变成NSMallocBLock,所以不会crash。在ARC下,其实不使用copy修饰block也是可以的。
推荐阅读
- 一个人的碎碎念
- 野营记-第五章|野营记-第五章 讨伐梦魇兽
- Shell-Bash变量与运算符
- 清明,是追思、是传承、是感恩。
- 牛人进化+|牛人进化+ 按自己的意愿过一生
- 七老修复好敏感、角质层薄、红血丝
- 华为旁!大社区、地铁新盘,佳兆业城市广场五期!
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 螃蟹和这些食物同吃,轻则腹泻、重则中毒!要小心哦~
- 八、「料理风云」