美文网首页iOS 知识点iOSiOS开发攻城狮的集散地
iOS11下 UITextfield 内存泄漏 解决方法

iOS11下 UITextfield 内存泄漏 解决方法

作者: 搞得赢 | 来源:发表于2018-01-02 20:19 被阅读1816次

产生场景

通过继承UITextField自定了一个textfield,在iOS11以下可以正常使用,在iOS11使用的时候无法释放,不走- (void)dealloc 方法。通过Facebook的开源库FBRetainCycleDetector检测得到相应报告 如图一 图二。尝试过切换第一响应者和在父类中置textfield为nil,未成功。

产生原因

根据FBRetainCycleDetector可以大致看到猜到原因。UITextField有一个名为_textContentView的私有变量,这个私有变量有一个名为_provider的私有变量,这个_provider就是UITextField自己。这些私有变量都是被强引用的,因此在使用当中引起了循环引用。

解决方案

在该UITextField子类当中置_provider为nil。

- (void)didMoveToWindow

{

    [super didMoveToWindow];

    if (@available(iOS 11.2, *)) {

        NSString *keyPath = @"textContentView.provider";

        @try {

            if (self.window) {

                id provider = [self valueForKeyPath:keyPath];

                if (!provider && self) {

                    [self setValue:self forKeyPath:keyPath];

                }

            } else {

                [self setValue:nil forKeyPath:keyPath];

            }

        } @catch (NSException *exception) {

            NSLog(@"%@", exception);

        }

    }

}

疑惑

iOS11为什么多一个provider私有成员变量,有什么作用,置为nil后有什么影响。

如果解决了您的问题,请点赞👍

相关文章

网友评论

  • 晓折:我也按照你的代码的方式写了,依然是释放不掉. 我这个视图里面有4个TF, 能正常释放掉两个,有两个始终释放不掉.
    晓折:四个TF用的是同一个抽取出来的构造方法,只是,四个当中只有一个的secureTextEntry为YES,其他全部为NO. 我也试过在iOS8的时候,的确都正常释放了.虽然没啥大事,就是蛋疼. 后来我发现我们项目中还有很多地方使用了TF后,都有同样的情况. 真实蛋疼呀....
    搞得赢:@晓折 这四个TF的使用方式不一样吧,都是怎样的使用方法
  • 骑着老鼠虐大象:- (void)didMoveToWindow {
    if (_textField) {
    [_textField removeAllSubviews];
    [_textField removeFromSuperview];
    _textField = nil;
    }
    }
    这样更好哦!
  • 798798123:搞不定了
  • 30d45f4db53b:为什么我试着按照你的方法试了,还是有内存警告,最郁闷的是,我的 ViewController 里边的 dealloc 方法已经执行了
  • 小小志伟:没有继承的textfield 也出现这个问题 该怎么解决
  • key3board:po主。 你这个内存监测是用什么第三方。 能介绍我一下。 为啥你是中文的
    搞得赢:facebook的,二次封装过了
    Dan1els:我也想知道,是不是作者自己汉化的?
  • l富文本l:我也遇到这个提示内存泄漏,尤其还只是MLeaksFinder这个框架提示,instruments没有,真的是找bug找崩溃了,现在终于知道问题所在了
    小小志伟:@lcying 恩 找到了@我一下
    l富文本l:@小小志伟 没。。。问题找到了,网上方法也试了,没用
    小小志伟:这个问题解决了么
  • gxxljss:这种算不算访问私有API
  • d4d98020ef88:代码最好用``` ```来展示比较好。。。
    我今天也发现了这个问题,加了方法之后的问题暂时没发现:smile:
    搞得赢:@Maybe7月 嗯,对的,从Xcode复制过来没有自动显示成代码格式。

本文标题:iOS11下 UITextfield 内存泄漏 解决方法

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