Copy关键字
2016-08-24 本文已影响7人
哔哩哔哩智能喵
/*
关于字符串为什么用copy
因为如果字符串用strong 或者 retain会修改内部数据,会影响对象的属性
如果用copy的话就会先copy一个出来,并不会对源对象进行修改
*/
NSMutableString *string = [NSMutableString stringWithFormat:@"lxc"];
Person p = [Person new];
p.name = string;
[string appendString:@"cool"];
NSLog(@"%@",p.name);
/
block和copy的关系
block默认存储在栈中,栈中的block访问到了外界的对象,不会对block进行retain
block如果在堆中,如果在block中访问了外界的对象,会对外界的对象进行一次retain
如果在使用copy保存block,这样可以保住block中使用的外界对象的命
避免以后调用block的时候,外界的对象已经释放了
*/
Dog *d = [Dog new];
NSLog(@"%lu",[d retainCount]);//1
p.pBlock = ^{
NSLog(@"%@",d);
};
NSLog(@"%lu",[d retainCount]);//2
//如果狗在调用之前block之前释放了,那么程序就会崩溃
[d release];
p.pBlock();
[p release];
//copy block之后引用循环引用
//如果对现货中的block又用到了对象自己,那么为了避免内存泄漏,应该将对象修饰为__block
__block Person *p1 = [Person new];
p.name = @"cyf";
NSLog(@"%lu",[p1 retainCount]);
p.pBlock = ^{
NSLog(@"name = %@",p.name);
};
NSLog(@"%lu",[p1 retainCount]);
p.pBlock();