美文网首页
IOS ObjectC weakSelf strongSelf

IOS ObjectC weakSelf strongSelf

作者: 纳兰嘉懿 | 来源:发表于2017-01-08 19:14 被阅读0次

Objective C 的 Block
是一个很实用的语法,特别是与GCD结合使用,可以很方便地实现并发、异步事务。但是,但是调用不当,Block 也会引起一些循环引用问题, Block 会 retain self,而 self又 retain 了 Block。因为在 ObjC 中,直接调用一个实例变量,会被编译器处理成 self->propertyself 是一个 strong 类型的变量,引用计数会加 1,于是,self retains queue, queue retains block,block retains self

  • 第①步 解决 retain circle

Apple 官方的建议是,传进 Block 之前,把 self 转换成 weak automatic 的变量,这样在 Block 中就不会出现对 self 的强引用。如果在 Block 执行完成之前,self 被释放了,weakSelf 也会变为 nil。

Apple 官方的建议是,传进 Block 之前,把 ‘self’ 转换成 weak automatic 的变量,这样在 Block 中就不会出现对 self 的强引用。如果在 Block 执行完成之前,self 被释放了,weakSelf 也会变为 nil


代码演示

//ObjectC code

#define Up_WeakSelf_wsf  __weak typeof(self) wsf = self

#define Up_StrongSelf_ssf  __strong  typeof(self) ssf = wsf; if (nil == ssf) return

Up_WeakSelf_wsf;

dispatch_async(dispatch_get_main_queue(), ^{

[wsf doAction];

});

clang 的文档表示,在 doSomething 内,weakSelf 不会被释放。但,下面的情况除外:


//ObjectC code

Up_WeakSelf_wsf;

dispatch_async(dispatch_get_main_queue(), ^{

  [wsf doAction];
  [wsf doOtherAction];
});

  • 第②步 解决Block中 weakSelf多次并安全调用

在 doAction 中,wsf 不会变成 nil,不过在 doAction 执行完成,调用第二个方法 doOtherAction 的时候,多线程环境下出现 weakSelf[wsf] 有可能被释放,于是这种情况下,strongSelf 就派上用场了:


//ObjectC code

Up_WeakSelf_wsf;

dispatch_async(dispatch_get_main_queue(), ^{
  Up_StrongSelf_ssf;

  [ssf doAction];
  [ssf doOtherAction];
});

*__strong 确保在 Block 内,strongSelf 不会被释放。

总结:

  • 在 Block 内如果需要单次访问 self 的方法、属性、变量,建议使用 weakSelf。

  • 如果在 Block 内需要多次 访问 self,确保安全,则需要使用 strongSelf。

weakSelf strongSelf
单次调用 多次调用

作者 @iSage https://github.com/WSFeng

2017 年 01月 08日 18:51:00


相关文章

  • IOS ObjectC weakSelf strongSelf

    Objective C 的 Block是一个很实用的语法,特别是与GCD结合使用,可以很方便地实现并发、异步事务。...

  • RN 调 js 核心代码

    ^{RCTJSCExecutor *strongSelf = weakSelf;if (!strongSelf |...

  • 宏定义

    1.weakSelf和strongSelf

  • SDWebImage4.0源码探究(二)具体代码拓展

    代码一 知识点:block参考:iOS中block的详解weakSelf、strongSelf <转自唐巧>Blo...

  • 不一样的书写样式

    **********************1.block中weakSelf 与 strongSelf******...

  • StrongSelf

    weakSelf : 防止循环引用 strongSelf: 防止释放 需要 强引用weakSelf,主要是处理一...

  • weakSelf/strongSelf

    1.Retain Circle的由来 当A对象里面强引用了B对象,B对象又强引用了A对象,这样两者的retainC...

  • weakSelf & strongSelf

    循环引用 循环引用不做过多的解释,两个对象互相持有对方,谁都无法先被释放掉。循环引用经常是由于使用block而引起...

  • weakSelf strongSelf

    解决 retain circle Apple 官方的建议是,传进 Block 之前,把 ‘self’ 转换成 we...

  • iOS宏定义

    1 weakself和strongself #ifndef weakify #if DEBUG #ifhas_fe...

网友评论

      本文标题:IOS ObjectC weakSelf strongSelf

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