1.字符串为什么要用copy和strong的区别
使用copy会重新开辟一块内存空间用来存储,不受原来对象的的影响,测试代码如下
strong修饰:
@property(nonatomic,strong) NSString *name;
NSMutableString *str = [NSMutableString string];
[str appendString:@"hello"];
self.name = str;
[str appendString:@"world"];
NSLog(@"%@",self.name);
打印结果是:helloworld
copy修饰
@property(nonatomic,copy) NSString *name;
NSMutableString *str = [NSMutableString string];
[str appendString:@"hello"];
self.name = str;
[str appendString:@"world"];
NSLog(@"%@",self.name);
打印结果是:hello
2.block作为属性为什么要使用copy修饰
第一种block
void (^demo)() = ^{
NSLog(@"aaaaa");
};
NSLog(@"%@",demo);
打印结果为:<__NSGlobalBlock__: 0x10009c2c0>(这是一个全局的block,全局block存储在内存中的代码区,一般情况block也不会这么使用)
第二种block
ARC情况下
int number = 1;
void (^demo)() = ^{
NSLog(@"aaaaa = %d",number);
};
NSLog(@"%@",demo);
打印结果为:<__NSMallocBlock__: 0x170250e30>(这种block存储在内存中的堆区)
MRC情况下
int number = 1;
void (^demo)() = ^{
NSLog(@"aaaaa = %d",number);
};
NSLog(@"%@",demo);
打印结果为:<__NSStackBlock__: 0x16fd3df28>(栈block,这种block存储在内存中的栈区)
第三种block
int number = 1;
void (^demo)() = ^{
NSLog(@"aaaaa = %d",number);
};
NSLog(@"%@",[demo copy]);
打印结果为:<__NSMallocBlock__: 0x1744406c0>(堆block)
//测试
@property(nonatomic,assign) void (^myBlock)();
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self test];
self.myBlock();
self.myBlock();
}
- (void)test{
int n = 1;
[self setMyBlock:^{
NSLog(@"%d",n);
}];
NSLog(@"%@",self.myBlock);
}
使用assign修饰的打印结果是<__NSStackBlock__: 0x16fd31f18> 1,有时候会发生奔溃
使用copy修饰的打印结果是<__NSMallocBlock__: 0x170243bd0>1 1,正常输出结果
3.其他修饰符
retain 在mrc中使用,strong在arc中使用,weak只有在arc中才使用,assign在arc和mrc中都可以使用,copy在arc和mrc中都可以使用。
weak一般修饰对象,assign一般修饰基本数据类型,weak修饰的对象销毁之后会指向nil,assign修饰的对象销毁之后不会指向nil会导致野指针操作。
如有错误之处欢迎指正!!!