iOS 内存管理iOS内存泄露iOS精品文章-性能优化(APM)

iOS自问自答:总结内存管理与优化

2017-05-11  本文已影响193人  HelloiWorld

目录

  1. ARC下如何避免内存泄露?如何检测?
  2. 你是如何做内存优化的?
  3. __block你知道多少?在什么时候使用?
  4. 你是如何做线上Bug定位的?(为嘛有这个问题,前几天出了个内存泄露+野指针的bug,so..)
  5. 关于经验和技巧还有什么想说的?

1. ARC下如何避免内存泄露?如何检测?

检测代码中是否存在循环引用问题,可使用 Facebook 开源的一个检测工具FBRetainCycleDetector,这里有两篇很棒的文章翻译并介绍了它的相关用法:
[译文]在iOS上自动检测内存泄露
FBMemoryProfiler 基础教程

2. 你是如何做内存优化的?

先弄清楚这里的学问,再来谈 iOS 内存管理与优化(二)

3. __block你知道多少?在什么时候使用?

block不允许修改外部变量的值,这里所说的外部变量的值,指的是栈中指针的内存地址。__block所起到的作用就是只要观察到该变量被 block 所持有,就将“外部变量”在栈中的内存地址放到了堆中。进而在block内部也可以修改外部变量的值。

关键字 适用模式 修饰类型 特性
__block ARC、MRC 对象、基本数据类型(int) 可在block块中被重新赋值
__weak ARC 对象(NSString) 对象回收时自动被置为nil

for循环+block块嵌套(常用于多张图片上传及下载)时,可保证block块内部执行完毕后才进入下一次循环,因为实际修改的是同一个地址的内容

一个同步访问数据的栗子
__block NSDictionary *dict = nil; 
do { 
    @autoreleasepool {
        NSMutableURLRequest *req = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:@""]];
        req.timeoutInterval = 10;   // timeoutInterval has no effect

        dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    
        __block NSURLSessionTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
            if (!error && data) {
               dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves error:nil];
            } else {
               NSLog(@"error: %@",[error description]);
            }
            dispatch_semaphore_signal(semaphore);
        }];
        [dataTask resume];
    
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    }
} while (nil == dict);

4. 你是如何做线上Bug定位的?

iOS 崩溃日志分析
iOS调试之 crash log分析
iOS 应用Crash日志分析整理

Require Location
分析工具symbolicatecrash 打开终端find /Applications/Xcode.app -name symbolicatecrash -type f找到工具所在位置 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash
.dSYM符号文件 Xcode -> Window -> Organizer -> Archives -> 选中项目 + Download dSYMs… /右键Show in Finder -> .xcarchive+右键Show in Finder
Xcode -> Products -> .app + 右键Show in Finder
crash报告 Xcode -> Window -> Device -> 选中测试手机 -> View Device Logs
Finder前往文件夹 -> ~/Library/Logs/CrashReporter/MobileDevice/<DEVICE_NAME>
Optional
.app文件 release生成的.ipa文件后缀改为.zip -> 解压 -> Payload目录下的appName.app文件
终端解析命令: 要求三者在同一文件夹下

5. 关于经验和技巧还有什么想说的?

都放在github上了 MyLibrary,持续更新ing

上一篇 下一篇

猜你喜欢

热点阅读