美文网首页iOS 13 SDK 适配
iOS开发-常见内存泄漏

iOS开发-常见内存泄漏

作者: 来者可追文过饰非 | 来源:发表于2021-07-15 11:11 被阅读0次

最近使用Leaks工具对项目进行了一波内存泄漏的检测,发现的问题及解决方式总结如下

  1. 使用class_copyPropertyList 或者 class_copyPropertyList 之后没有释放
    unsigned int outCount;
    Ivar *ivars = class_copyIvarList([self class], &outCount);
    ...
    ...
    // 释放 防止内存泄漏
    free(ivars);

2.以下代码会检测到内存泄漏

+ (id)load:(NSString *)service
{
    id ret = nil;
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    //Configure the search setting
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData];
    [keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit];
    CFDataRef keyData = NULL;
    if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {
        @try {
            ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData];
        } @catch (NSException *e) {
            NSLog(@"Unarchive of %@ failed: %@", service, e);
        } @finally {
        }
    }
    return ret;
}

修改方式 (释放掉被SecItemCopyMatching引用的CFDictionaryRef)

+ (id)load:(NSString *)service
{
    id ret = nil;
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];
    //Configure the search setting
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData];
    [keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit];
    CFDataRef keyData = NULL;
    CFDictionaryRef cf_query = (__bridge_retained CFDictionaryRef)keychainQuery;
    if (SecItemCopyMatching(cf_query, (CFTypeRef *)&keyData) == noErr) {
        @try {
            ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData];
        } @catch (NSException *e) {
            NSLog(@"Unarchive of %@ failed: %@", service, e);
        } @finally {
        }
    }
    CFRelease(cf_query);
    return ret;
}

3.GoogleDataTransport 中内存泄漏,源代码如下


image.png

该问题在8.3.1中已经解决,遇到此问题的可以更新下GoogleDataTransport SDK至最新版本试一下


image.png

相关文章

  • iOS开发-常见内存泄漏

    最近使用Leaks工具对项目进行了一波内存泄漏的检测,发现的问题及解决方式总结如下 使用class_copyPro...

  • iOS 内存泄漏三两事

    iOS 内存泄漏三两事 iOS 内存泄漏三两事

  • Android内存泄漏相关

    问题1 内存泄漏的基本定义是什么?内存泄漏有什么危害?问题2 开发中常见的内存泄漏的情况有哪些?什么原因造成的?怎...

  • instruments - leaks

    iOS开发中,难免会出现内存泄漏的情况,此处通过instruments 中的 leaks工具来检测程序的内存泄漏问...

  • Instruments 之 Memory

    在 iOS 开发中,内存泄漏的检测基本是 APP 功能开发完成之后的必做项目。内存泄漏的检测手段很多,这里就讲讲如...

  • Xcode调试工具

    一.静态内存分析工具 编译阶段查找内存泄漏等问题 1.常见内存泄漏问题 常见的内存泄漏除了循环引用,CoreFou...

  • iOS 常见内存泄漏

    一、基本概念 内存泄漏(memory leak):是指申请的内存空间使用完毕之后未回收。一次内存泄露危害可以忽略,...

  • iOS内存泄漏

    iOS开发中,内存泄漏的问题常常遇到. 轻则影响性能,重则导致crash.那么,有哪些方法可以有效的检测内存泄漏的...

  • 带你学开源项目:LeakCanary-如何检测 Activity

    OOM 是 Android 开发中常见的问题,而内存泄漏往往是罪魁祸首。为了简单方便的检测内存泄漏,Square ...

  • Android-推荐一个检测内存泄漏的库(LeakCanary)

    在Android开发当中,内存泄漏是会影响用户体验的。LeakCanary开源库是一个常见的定位内存泄漏的开源库,...

网友评论

    本文标题:iOS开发-常见内存泄漏

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