一、记录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方法进行覆盖
网友评论