深入分析iOS问题-performSelector:onThread:withObject:waitUntilDone

本文深入探讨了一起因误用`performSelector:onThread:withObject:waitUntilDone`导致的iOS内存泄露问题。通过现场还原、内存泄露现象分析、查找原因和泄露原理,揭示了线程停止时runloop未处理任务对象导致的内存无法释放。解决方案包括确保线程运行状态和传入autorelease对象或深拷贝的自定义对象。
摘要由CSDN通过智能技术生成

今天检查内存泄露的问题,发现误用系统API的问题。导致内存泄露。这个问题还是比较常见的,我觉得还是记下了,分享给大家

现场还原

–FYSingleInstance类主要代码

// 初始化上下文
+ (FYSingleInstance *) S {
    static FYSingleInstance * instance;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (!instance) {
            instance = [[FYSingleInstance alloc] init];
        }
    });

    return instance;
}


/*
 * 停止线程
 */
+ (void) stopThread:(id) thread withUserId:(id) userId {
    // 停止初始化线程
    @try {
        [[FYSingleInstance S] performSelector:@selector(stop:) onThread:thread withObject:userId waitUntilDone:NO];
    }
    @catch (NSException * exception) {
        NSLog(@"%@", exception.callStackSymbols);
    }
}

–使用代码用例

[FYSingleInstance stopThread:_currentThread withUserId:nil];

内存泄露现象

如果不断调用上述代码,就看到不断有内存泄露。

请看下图:

内存泄露图片

抽丝剥茧开始

好奇怪为啥这么多16 bytes在内存中,而且使用代码用例调用越多,这些16bytes的内存越多。

内存泄露就是这个吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值