美文网首页
iOS性能优化笔记

iOS性能优化笔记

作者: 海浪萌物 | 来源:发表于2018-06-23 16:35 被阅读14次

    一、记录app启动时间方法

    1、在main.m文件中声明变量mainStartTime ,并记录启动开始时间。

    CFAbsoluteTime mainStartTime;
    
    int main(int argc, char * argv[]) {
        @autoreleasepool {
            mainStartTime = CFAbsoluteTimeGetCurrent();
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
    }
    

    2、在AppDelegate里再次声明一下,其中extern的意思是标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。此外extern也可用来进行链接指定

    extern CFAbsoluteTime mainStartTime;
    
    

    然后在didFinishLaunchingWithOptions里面打印出来启动时长

        NSLog(@"mainStartTime%F",CFAbsoluteTimeGetCurrent() - mainStartTime)
    
    

    二、循环引用
    1、堆:对象

    2、栈
    3、静态区

    weakSelf:打破外面循环环,

    strongSelf:内部只是个临时变量,block执行完后会释放

    野指针问题:

    EXC_BAD_ACCESS错误的时候,想获取更多信息只要在schemes---->Diagnostics----->把ZombieObjects勾上即可;一般出现在assign的修饰的属性中,因为assign修饰的属性引用计数器不加1,并且当引用的对象释放后并不会变成nil,而是继续持有对象的内存地址,所以容易造成野指针错误

    三、内存泄露:
    1、静态检测方法:
    ARC、CG、 C、CF这些类的对象需要手动释放

    僵尸对象检测
    Analyze检测

    自动开启方法:
    在Build Settings的---->Analyze During开启一下,然后每次编译时候就自动检测一下

    2、动态检测方法(instrument,第三方内存检测)

    leak,采样,埋点

    MLeaksFinder,第三方检测工具,操作时候可以定位错误信息

    3、析构 (dealloc)

    三,swizzleSEL:方法记得判断主类有没有实现该方法,如果没实现就替换父类的

    void swizzleMethod(Class class,SEL originalSelector,SEL swizzledSelector){
        // the method might not exist in the class, but in its superclass
        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
    
        // class_addMethod will fail if original method already exists
        BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
    
        // the method doesn’t exist and we just added one
        if (didAddMethod) {
            class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
        }
        else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    }
    

    分类中的load并不会对主类中的load方法进行覆盖

    相关文章

      网友评论

          本文标题:iOS性能优化笔记

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