美文网首页
面试题:strong, weak, assign, copy 的

面试题:strong, weak, assign, copy 的

作者: 常在士心 | 来源:发表于2021-05-16 10:11 被阅读0次

    strong

    强引用,只可以修饰对象,属性的默认修饰符,其修饰的对象引用计数增加1

    weak

    弱引用,只可以修饰对象,指向但不拥有对象,其修饰的对象引用计数不增加,可以避免循环引用,weak修饰的对象释放后,指针会被系统置为nil,此时向对象发送消息不会奔溃

    assign

    可以修饰对象和基本数据类型,如果修饰对象,其修饰的对象引用计数不增加,可以避免循环引用,但assign修饰的对象释放后,指针不会被系统置为nil,这会产生野指针的问题,此时向对象发送消息会崩溃。所以assign通常用于基本数据类型,如int ,float, NSInteger, CGFloat ,这是因为基本数据类型放在栈区,先进先出,基本数据类型出栈后,assign修饰的变量就不存在了,不用担心指针的问题。

    copy

    引用,修饰不可变的对象,比如NSString, NSArray, NSDictionary。copy和strong类似,不同之处在于,copy修饰的对象会先在内存中拷贝一个新的对象,copy会指向那个新的对象的内存地址,这样避免了多个指针指向同一对象,而导致的其中一个指针改变了对象,其他指针指向的对象跟着改变,举个例子:

    @property(strong) NSString *name1;
    @property(copy) NSString *name2;

    NSMutableString *name3 = [NSMutableString stringWithString:@"Danny"];
    self.name1 = name3;
    self.name2 = name3;
    [name3 setString:@"Liming"];
    NSLog(@"%@", self.name1); // Liming
    NSLog(@"%@", self.name2); // Danny
    我们可以看到使用strong的属性name1会跟着name3变,因为他们都指向同一个NSMutableString的对象,而name2预先拷贝了name1,从而避免了和name1一起变化。

    copy的原则就是,把一个对象赋值给一个属性变量,当这个对象变化了,如果希望属性变量变化就使用strong属性,如果希望属性变量不跟着变化,就是用copy属性。

    相关文章

      网友评论

          本文标题:面试题:strong, weak, assign, copy 的

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