iOS性能优化笔记

2018-06-23  本文已影响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方法进行覆盖

上一篇 下一篇

猜你喜欢

热点阅读