美文网首页
iOS strong和copy assign与weak

iOS strong和copy assign与weak

作者: Rockerliang | 来源:发表于2020-04-29 16:01 被阅读0次

    strong和copy

    • 当原字符串是NSString时,由于是不可变字符串,所以,不管使用strong还是copy修饰,都是指向原来的对象,copy操作只是做了一次浅拷贝。

    • 当源字符串是NSMutableString时,strong只是将源字符串的引用计数加1,而copy则是对原字符串做了次深拷贝,从而生成了一个新的对象,并且copy的对象指向这个新对象。另外需要注意的是,这个copy属性对象的类型始终是NSString,而不是NSMutableString,如果想让拷贝过来的对象是可变的,就要使用mutableCopy。

    所以,如果源字符串是NSMutableString的时候,使用strong只会增加引用计数。
    但是copy会执行一次深拷贝,会造成不必要的内存浪费。而如果原字符串是NSString时,strong和copy效果一样,就不会有这个问题。

    assign与weak

    我们都知道,assign用来修饰基本数据类型,weak用来修饰OC对象。
    其实照理,assign也能修饰OC对象,但是assign修饰的对象在该对象释放后,其指针依然存在,不会被置为nil——这就造成了一个很严重的问题:出现了野指针。当访问这个野指针时,指向了原地址,而原地址有两种情况:

    第一种情况:原地址没有改变,代码运行通过,但很有可能有逻辑bug。
    第二种情况:原地址已经改变,结果不可预测,多数崩溃,也有可能出现其他莫名错误。

    但是用weak来修饰的话,对象释放的时候会把指针置为nil,从而避免了野指针的出现。
    那又有个疑问出现了,凭什么基本数据类型就可以使用assign。这就要扯到堆和栈的问题了,基本数据类型会被分配到栈空间,而栈空间是由系统自动管理分配和释放的,就不会造成野指针的问题。

    weak 修饰的指针变量,在指向的内存地址销毁后,会在 Runtime 的机制下,自动置为 nil。
    _Unsafe_Unretain不会置为 nil,容易出现 悬垂指针,发生崩溃。但是 _Unsafe_Unretain 比 __weak 效率高。

    相关文章

      网友评论

          本文标题:iOS strong和copy assign与weak

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