美文网首页
weak、strong、copy、assign

weak、strong、copy、assign

作者: 冷武橘 | 来源:发表于2020-05-29 15:38 被阅读0次

    一、属性用weak和assign的区别

    • weak:用来修饰oc对象。
    • assign:一般用来修饰基本数据类型;也可以用来修饰oc对象。
    • 当assign修饰oc对象时,生成的成员变量的指针类型是__unsafe_unretained(弱引用)修饰的对象被释放后,指针不会置空,而是变成一个野指针,那么此时如果访问这个对象的话,程序就会Crash,抛出BAD_ACCESS的异常;当weak修饰oc对象时,生成的成员变量的指针类型是__weak(弱引用),修饰的对象被释放后,指向对象的指针会置空,也就是指向nil,不会产生野指针;
      深拷贝和浅拷贝

    二、strong和copy

    @interface Student : NSObject
    @property(nonatomic,strong)NSString*name;
    @property(nonatomic,copy)NSString*name1;
    @end
    
     NSMutableString *string = [[NSMutableString alloc]initWithString:@"1234"];
     Student *s = [[Student alloc]init];
     s.name = string;
     s.name1 = string;
     [string appendString:@"abc"];
      NSLog(@"%@",string);  1234abc
      NSLog(@"%@",s.name);1234abc
      NSLog(@"%@",s.name1);1234
    

    当熟悉使用copy和strong修饰时,系统自动生成的set方法就如下面这样,name1的源字符串是可变的,copy是深拷贝。_name1和源string是互不影响的。

    @implementation Student
    - (void)setName1:(NSString *)name1{
        _name1 = name1;
    }
    
    - (void)setName1:(NSString *)name1{
         _name1 = [name1 copy];
    }
    @end
    

    通过以上的例子可以知道ARC机制下,对字符串对象属性的修饰,你可以用strong也可以用copy,一般情况下效果是一样的,strong的性能更高一些。只有在源字符串是可变时,不合理使用strong也许会发生一些不期待的效果。
    使用建议:一般情况下作为数据模型的属性,属性的值一般都是直接源于网络数据的字符串,不会是可变的。使用strong一般不会有问题的。其它的情况下,像以上的用可变的字符串作为源字符串也是极少的,因此大胆放心的使用strong,某种特殊情况你必须使用copy!
    深拷贝和浅拷贝

    三、block的copy

    • 没有访问auto变量,block的类型是NSGlobalBlock
    • 访问了auto变量,block的类型是_NSStackBlock,但是在ARC环境下,block被强指针指向时,编译器会根据情况自动将栈上的block复制到堆上。
      ARC下block属性的建议写法
      @property (strong, nonatomic) void (^block)(void);
      @property (copy, nonatomic) void (^block)(void);
      参考:block的底层原理

    相关文章

      网友评论

          本文标题:weak、strong、copy、assign

          本文链接:https://www.haomeiwen.com/subject/awpaahtx.html