• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ios > display:inline-block类方法中使用了block,如何避免循环引用?

display:inline-block类方法中使用了block,如何避免循环引用?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-05

佚名通过本文主要向大家介绍了display:block,display inline block,css display block,style.display block,display none block等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:display:inline-block 类方法中使用了block,如何避免循环引用?
描述:

代码如下,在netRequestCallBack的中的使用了vc,Xcode会告警提示: 可能导致循环引用。 请问如何消除?

+ (void)JumpToMe {
    dispatch_async(dispatch_get_main_queue(), ^{
    AUIViewController *vc = [[AUIViewController alloc] init];
    vc.mainModel.netRequestCallBack = ^(NSError *error){
        [[vc navigationController] pushViewController:vc animated:YES];
    };
    [vc.mainModel sendNetworking];
    });
}

尝试:

  1. 对vc使用修饰词 __block,但不能解决问题,而且__block修饰后,vc仍然是强引用的。

  2. 对vc使用修饰词__weak,确实消除了Xcode关于循环引用的告警。但netRequestCallBack 运行时,会发现vc已经被为nil。
    我理解出现这种情况,是在类方法完成后,vc没有了持有者了,也是被释放了。

所以,请问有什么方法可以解决这个吗?


解决方案1:

先不说循环引用的问题

[[vc navigationController] pushViewController:vc animated:YES];

就这一句就有问题 vc没被push vc.navigationController会不为Nil? vc.navgationController 为nil的话 能push vc?

解决方案2:

是否是循环引用与调用方法无关,只与引用关系有关。

在你的例子中,引用环为 vc --> mainModel --> netRequestCallBack --> vc。("-->"表示引用关系)

对象被释放的先决条件为该对象不被其他对象持有。而你的例子中vc被netRequestCallBack持有,所以不会被释放。

打破引用环的办法为使用__weak来声明被block捕获的变量。
即

__weak AUIViewController *tmpVC = vc;
vc.mainModel.netRequestCallBack = ^(NSError *error){
    [[tmpVC navigationController] pushViewController:vc animated:YES];
};

而对于vc被释放的问题,在于vc没有被别的对象持有。正确的解决办法应该是从当前navigaionController或别的vc栈中,找到该vc,然后对该vc进行操作。

解决方案3:

在你的block里用__strong __typeof(&*weaksSelf) strongSelf = weakSelf修饰

解决方案4:

block属性用copy,然后添加__strong __typeof(weaksSelf) strongSelf = weakSelf,不过你代码逻辑好怪


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • display:inline-block类方法中使用了block,如何避免循环引用?
  • ARC中Block因为作用域被释放的问题

相关文章

  • 2017-06-05 像苹果手机将多个app整合到一个文件夹中,哪位大神能给点思路
  • 2017-06-05 ios模拟器电脑版IOS模拟器运行可以,手机运行出错
  • 2017-06-05 不知道是不是删了个东西,Cocoapodspodsetup老是出错,求大神解决!!!
  • 2017-06-05 iOSUI设计iOS滑杆实现,UI给了视觉图,没有实现思路
  • 2017-06-05 iOSPLCameraStreamingKit最新的demo,无法运行?
  • 2017-06-05 messagesenttodeallocatedinstance
  • 2017-06-05 用UIPickerView做一个两列的城市选择器,选择第一列之后,更新第二列数据时为什么会崩溃。
  • 2017-06-05 二级缓存和三级缓存(swift)关于iOS缓存策略的疑问
  • 2017-06-05 如何用代码给xib创建出来的cell添加约束
  • 2017-06-05 iOSimageView渲染的问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 手机qq浏览器如何去掉浏览器底部的菜单栏?
    • 几个功能模块公用了部分代码,想修改其中一个功能,如何避免破坏其他功能
    • 往字典里赋值有时候不成功的原因???
    • QQ里打开pdf功能中,左上角有一个使用其他应用程序打开,请问iOS开发中,如何像QQ一样获取其他应用
    • Cannotinvoke'map'withanargumentlistof[图]
    • Swift:textField可输入的长度为4个汉字或者8个字符。咋判断
    • 在Mac系统里,让office保存后放到别的电脑时打开出现不兼容的问题,怎么解决???
    • 移动端a标签无法跳转
    • iOS基础控件IOS的UITableView问题
    • iOS一个播放器的音乐内容数据怎么同步到两个控制器中?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有