iOS11下 UITextfield 内存泄漏 解决方法

产生场景

通过继承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后有什么影响。


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、设置UILabel行间距 NSMutableAttributedString* attrString = [[...
    十年一品温如言1008阅读 1,705评论 0 3
  • 一、简介 <<UITextField(文本框) : UITextField被用作项目中获取用户信息的重要控件.在A...
    无邪8阅读 5,492评论 0 1
  • iOS开发中,页面传值是很常见的,但是页面传值你究竟知道多少呢?笔者这篇文章就是给大家介绍一下页面传值的具体方式,...
    蒲公英少年阅读 2,181评论 10 44
  • 2017年10月16日种子日记 何德胜第77天 我今天不是为了我一个人而闻思修行,而是为了一切如母有情众生,愿他们...
    何德胜觉悟阅读 224评论 1 3
  • 贵州铜仁石阡支教,第一个关键词:实 李秋生:体育课15节,还有篮球足球特色班 来来来,孩子们!听好口令,跟着李老师...
    六郎gf阅读 1,846评论 2 1