美文网首页iOS 进阶
__weak修饰详解及解决循环引用使用

__weak修饰详解及解决循环引用使用

作者: 楚简约 | 来源:发表于2017-01-16 16:34 被阅读628次

_weak typeof(self) weakSelf = self;

第一、weak弱引用不能持有对象实例。
在持有某对象的弱引用时,若该对象被废弃,则此弱引用自动失效并处于nil被赋值的状态。

第二、内存管理原则
1、默认strong,可选weak。strong下不管成员变量还是property,每次使用指针指向一个对象,等于自动调用retain(), 并对旧对象调用release(),所以设为nil等于release。
2、只要某个对象被任一strong指针指向,那么它将不会被销毁,否则立即释放,不用等runloop结束。所有strong指针变量不需要在 dealloc中手动设为nil,ios会自动处理,debug可以看到全部被置为nil,最先声明的变量最后调用dealloc释放。

3、官方建议IBOutlet加上__weak,实际上不用加也会自动释放;

4、优先使用私有成员变量,除非需要公开属性才用property。

5、避免循环引用,否则手动设置nil释放。

6、block方法常用声明:@property (copy) void(^MyBlock)(void); 如果超出当前作用域之后仍然继续使用block,那么最好使用copy关键字,拷贝到堆区,防止栈区变量销毁。

7、创建block匿名函数之前一般需要对self进行weak化,否则造成循环引用无法释放controller:

__weak MyController weakSelf = self 或者 __weak __typeof(self) weakSelf = self;
执行block方法体的时候也可以转换为强引用之后再使用:MyController
strongSelf = weakSelf; if (!strongSelf) { return; }

第三、关于__weak和__block区别总结

__weak 声明了一个可以自动 nil 化的弱引用。

1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。

2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。

3.__block对象可以在block中被重新赋值,__weak不可以

相关文章

  • __weak修饰详解及解决循环引用使用

    _weak typeof(self) weakSelf = self; 第一、weak弱引用不能持有对象实例。在持...

  • Weak解读

    在常规开发中我们经常使用__weak修饰符来修饰一个对象,来解决比如循环引用问题.今天具体来看看weak底层实现原...

  • Strong-Weak Dance

    对 Strong-Weak Dance 的思考 在使用Block时,除了使用__weak修饰符避免循环引用外,还有...

  • weak 原理

    weak作用 weak我们常用来解决循环引用,因为weak修饰的对象引用计数不会增加,当对象释放的时候回自动置为n...

  • Block 04 - 循环引用

    Block 04 - 循环引用 在 ARC 环境下解决循环引用 使用 __weak、__unsafe_unreta...

  • 内存优化

    cell重用机制 循环引用delegate代理声明使用weak修饰NSTimerblock 其他NSNotific...

  • 关于block 使用__weak & __strong 来解决循

    关于block 使用__weak & __strong 来解决循环引用的问题__weak&__strong的使用解...

  • 从Objective-C源码看weak

    在Objective-C中,一般为了解决循环引用的问题,我们会使用weak 修饰,使得一方不会持有另一方,解决循环...

  • 性能优化3

    循环引用 解决办法 weak 在调用过程中 发现有时打印为nil,是因为用weak修饰的weakSelf是弱引用 ...

  • 10.1 __weak底层原理

    我们在平时的开发过程中,经常会使用到__weak关键字来解决循环引用的问题,被__weak修饰的指针就变成了弱指针...

网友评论

    本文标题:__weak修饰详解及解决循环引用使用

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