Copy关键字

/*
关于字符串为什么用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();

你可能感兴趣的:(Copy关键字)