IOS程序异常crash捕获与拦截 (我下面的Demo 就是在这部分代码上做了简化,以方便理解) 原理 iOS应用崩溃,常见的崩溃信息有EXC_BAD_ACCESS、SIGABRT XXXXXXX,而这里分为两种情况...- (void)setCatchExceptionHandler { // 1.捕获一些异常导致的崩溃 NSSetUncaughtExceptionHandler(&HandleException...]; NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; [userInfo setObject:callStack...第五步,写一段会导致崩溃的代码 我是在ViewController 中添加了一个点击事件,弄了一个数组越界的Bug: - (void)touchesBegan:(NSSet *)touches...遇到数组越界,应用依然没崩溃 sunnyxx 称之为回光返照,为什么呢? 我再一次点击视图,应用依然还是崩溃了,只能防止第一次崩溃。 我测试了,确实是第二次应用崩溃,未能起死回生。
线上崩溃可以通过 iTunesConnect 中心的Cash收集,也可以通过第三方Cash收集工具,亦或自己在工程中手动收集崩溃日志上传到服务器中,本文做个小结,希望对初入者能有些帮助。...使用第三方软件:itools等 如果你平时不用iTunes,而是使用itools这类第三方的软件对iPhone设备进行管理,也是没问题的。 ?...收集崩溃日志 获取崩溃信息方式 在iOS中获取崩溃信息的方式有很多,比较常见的是使用友盟、云测、百度、Crashlytics等第三方分析工具,或者自己收集崩溃信息并上传公司服务器。...下面列举一些我们常用的崩溃分析方式: 自己实现应用内崩溃收集,并上传服务器。 使用友盟、云测、百度、Crashlytics等第三方崩溃统计工具。..., 会导致其它工具收集不全的问题。
类型安全: 转换过程中,所有的数据类型都会被检测一遍,以保证类型安全,避免崩溃问题。 无侵入性: 模型无需继承自其他基类。 轻量: 该框架只有 5 个文件 (包括.h文件)。...自动转换不支持的值将会被忽略,以避免各种潜在的崩溃问题。...property NSString *name; @property NSDate *createdAt; @end @implementation User // 当 JSON 转为 Model 完成后,该方法会被调用...NSDate dateWithTimeIntervalSince1970:timestamp.floatValue]; return YES; } // 当 Model 转为 JSON 完成后,该方法会被调用...- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic { if (!
KVO 允许一个对象监听另一个对象特定属性的改变,并在改变时接收到事件。但是 KVO API 的设计,我个人觉得不是很合理。被观察者需要做的工作太多,日常使用时稍不注意就会导致崩溃。...KVO 日常使用造成崩溃的原因通常有以下几个: KVO 添加次数和移除次数不匹配: 移除了未注册的观察者,导致崩溃。 重复移除多次,移除次数多于添加次数,导致崩溃。...添加了观察者,但未实现 observeValueForKeyPath:ofObject:change:context: 方法,导致崩溃。 添加或者移除时 keypath == nil,导致崩溃。...KVO 防止 Crash 常见方案 为了避免上面提到的使用 KVO 造成崩溃的问题,于是出现了很多关于 KVO 的第三方库,比如最出名的就是 FaceBook 开源的第三方库 facebook / KVOController...经测试可以发现,成功的拦截了这几种因为 KVO 使用不当导致的崩溃。
修饰,当响应者释放会出现野指针,向野指针发送消息造成崩溃;在iOS 9(更新的系统版本有待考证)之后,苹果对其做了优化,会在响应者调用dealloc方法的时候执行removeObserver:方法。...defaultCenter] addObserver:self selector:@selector(respondsToNotification:) name:@"test0" object:nil]; } //该代码导致的结果是...可能有人会问,为什么系统库没有做个重复添加的判断?当然,这可能是为了让我们更灵活的运用,也可能是对时间复杂度的一种妥协吧?。...有过比较长开发经验的同学应该都有过,没有及时的移除通知而导致意外崩溃的情况。...这就是为什么不直接使用observer响应者对象对比做释放操作。 写在后面 关于实现部分,虽然我做了个大致的测试,可能还是会存在一些潜在的问题,希望各位大佬不惜笔墨点拨一番?。
1、NSString、NSArray、NSDictionary等等经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary...1、添加,删除,修改数组内的元素的时候,程序会因为找不到对应的方法而崩溃,因为copy 就是复制一个不可变NSArray的对象; 2、使用了atomic属性会严重影响性能﹔ 如何让自己的类用copy修饰符...假如一个属性被声明为dynamic var,然后你没有提供@setter方法和@getter方法,编译的时候没问题,但是当程序运行到instance.var = someVar,由于缺 setter方法会导致程序崩溃...;或者当运行到someVar = var时,由于缺 getter方法同样会导致崩溃。...NSRunLoop对象,这就解释了∶ 为什么我们的应用可以在无人操作的时候休息,需要让它干活的时候又能立马响应。
所谓的一次性就是:mehod-swizzling写在load方法中,而load方法会主动调用多次,这样会导致方法的重复交换,使方法sel的指向又恢复成原来的imp的问题 解决方案 可以通过单例设计原则...,而LGStudent中有这个方法(在LG分类中),所以不会报错 崩溃的点在于[p personInstanceMethod];,其本质原因:LGStudent的分类LG中进行了方法交换,将person...原因是 栈溢出,递归死循环了,那么为什么会发生递归呢?...类名 真身 NSArray __NSArrayI NSMutableArray __NSArrayM NSDictionary __NSDictionaryI NSMutableDictionary _...,但是实际并不会崩溃
,为什么呢?...---- 分段解析 为什么选择category而不是subclass 我想很多人都会有疑问,为什么选择category而不是继承,毕竟category不能添加属性,用起来不是很方便。...通过这里我们知道我们OC的语言是怎么实现的了吧,就是通过runtime转化成了C++的代码,然后进行运行。 从这你也应该知道为什么OC中叫发送消息,不叫函数调用了吧。...另外你还应该知道为什么OC中方法只声明,不实现,编译时只报警不报错,运行时crash是为什么了吧。 既然说到这里就多少说一说C与OC吧。...为什么要创建一个字典呢,因为我们要保证只取到这一个cell。
(iOS 7推出的) 4.利用第三方库WebViewJavascriptBridge。 5.利用第三方cordova库,以前叫PhoneGap。...---- 今天就详细的介绍一下使用UIWebView拦截URL 的方式来实现JS与OC 的交互。 为什么不使用第三方库或者RAC呢?...loadURL的实现来自关于UIWebView和PhoneGap的总结一文。 2.为什么loadURL 中的链接,使用统一的scheme?...3.为什么自定义一个asyncAlert方法? 答:因为有的JS调用是需要OC 返回结果到JS的。...导致alert 卡死界面。如果回调的JS 是一个耗时的操作,那么建议将耗时的操作也放入setTimeout的function 中。
1.2.2 dSYM文件有什么作用 当我们软件 release 模式打包或上线后,不会像我们在 Xcode 中那样直观的看到用崩溃的错误,这个时候我们就需要分析 crash report...大前提是我们需要有软件版本对应的 dSYM 文件,这也是为什么我们很有必要保存每个发布版本的 Archives 文件了。.../xuhanhanhan/article/details/50580093 现在是2016年一月份,已经不能在iTunes Connect查看崩溃日志上查看崩溃日志了,现在苹果的做法是你在...xcode上登录你的账号,打开xcode,点击上面的window选择organizer,出现如图 ,然后选择你要查看的版本,就可以看对应的崩溃日志。..._dataDic) { _dataDic = [[NSMutableDictionary alloc] init]; } return _dataDic; } 2.2 调试问题
); return YES; } } return NO; } - (NSDictionary *)getIPAddresses { NSMutableDictionary...*addresses = [NSMutableDictionary dictionaryWithCapacity:8]; // retrieve the current interfaces...UBSan.jpg 这些报错虽然不会直接导致问题,但是按照苹果官方的描述,可能导致崩溃或性能下降: Misaligned Pointer (错位的指针) Detects when code accesses...检测代码何时访问错位的指针或创建错位的引用。...解除一个错位的指针有未定义的行为,并可能导致崩溃或性能下降。 在序列化或反序列化数据的代码中,经常发生违反对齐方式的情况。通过使用保留数据对齐的序列化格式来避免这个问题。
,b,c); 输出结果: abcabcabc,abcabcabc,abcabcabc 0xf9f7789ebc9c00cc,0xf9f7789ebc9c00cc,0x6000011f7090 疑问 为什么...所以只需要拷贝一个新的指针去指向a指向的地址就可以了。而c是a mutableCopy得来的。因为变成NSMutableString 而且不影响之前的对象,所以要拷贝出一个新的内存空间。...所以这里就引出一个概念 深拷贝 内容拷贝 创建新对象 浅拷贝 指针拷贝 引用计数+1 为什么浅拷贝要引入计数+1 因为a 和 b 指向同一个内存地址。...而此时b 还在引用释放的内存空间,就会产生坏内存访问的崩溃现象 其他拷贝对象同理 不可变copy 为浅拷贝 注意 Tagged Pointer对象比较特殊。不用管理引用计数。...总结 NSString NSMutableString NSArray NSMutablArray NSDictionary NSMutableDictionary copy 浅拷贝 深拷贝 浅拷贝
作为iOS开发的著名三方库YYKit可以说是家喻户晓,是一个集大成的开源库,今天我们说一下关于旗下的JSON转换功能小技巧 ?...= [NSDate dateWithTimeIntervalSince1970:timestamp.floatValue];return YES;} // 当 Model 转为 JSON 完成后,该方法会被调用...// 你也可以在这里做一些自动转换不能完成的工作。- (BOOL)modelCustomTransformToDictionary:(NSMutableDictionary *)dic {if (!...,而OC作为一门动态的类C语言我们完全可以采用简化的方式实现------宏定义 #define YYModelWhiteList(array) + (NSArray *)modelPropertyWhitelist...(以 Class 或 Class Name 的形式)。
概念浅拷贝:浅拷贝就是指针拷贝,就是拷贝一份指向该对象的指针,就是复制的对象和原对象都指向同一个地址深拷贝:深拷贝是内容拷贝,真正的复制一份,复制对象的内容。复制的对象指向新的地址。...图片copy 和 mutablecopymutableCopy拷贝出来的对象类型总是可变类型(例如, NSMutableString, NSMutableDictionary, NSMutableArray...等等)mutableCopy拷贝出来的对象类型总是可变类型(例如, NSMutableString, NSMutableDictionary, NSMutableArray等等)对象要想具有copy和mutablecopy...功能要是NSCopying和NSMutableCopy协议,实现copywithzone和mutablecopywithzone图片NSString为什么用copy修饰,不用strong#import...但是 block 在创建的时候内存默认分配在栈上,而不是堆上的。所以它的作用域仅限创建时候的作用域内,当你在该作用域外调用该 block 时,程序就会崩溃。
a.NSString、NSArray、NSDictionary 等等经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary...这个类是 NSString 的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。...所以,这时就要拷贝一份“不可变” (immutable)的字符串,确保对象中的字符串值不会无意间变动。只要实现属性所用的对象是“可变的” (mutable),就应该在设置新属性值时拷贝一份。...3.这个写法会出什么问题: @property (copy) NSMutableArray *array; a.添加,删除,修改数组内的元素的时候,程序会因为找不到对应的方法而崩溃.因为 copy 就是复制一个不可变...b.nonatomic 不是默认的 更快 线程不安全 如有两个线程访问同一个属性,会出现无法预料的结果 5.如何让自己的类用 copy 修饰符?如何重写带 copy 关键字的 setter?
: lock.lock()方法写在try里面 第二种写法会导致真实的崩溃信息被覆盖了,假设我们在lock.lock(); 上方加入这样一行代码int num = 1/0;代码如下: ReentrantLock...这样在实际的应用中对我们排查问题是有很大的阻碍性的。真实的崩溃信息被覆盖掉了 原因是: 因为上述代码无论是否会抛出异常,finally中的代码块都会被执行,最后会调用unlock()方法。...:lock()方法可能会抛出异常,然后会执行finally代码块中的unlock()方法,在unlock()方法中,会检查当前线程是否是拥有锁的线程,如果不是则会抛出异常,同样会导致真实的崩溃信息丢失(...导致覆盖掉lock.lock()出现异常的信息)。...既然unlcok()方法会抛出异常,为什么要写在finally代码块中呢? 因为如果程序出现异常,依然能够保证锁会被释放掉,避免死锁的发生。
GB代码规范 头文件#import的顺序(商量) 写法模板 #import #import 方库> #import "其他类" 尽量按照先系统类 第三方类 自己写的类顺序导入...= @"" 对于局部的变量尽量的初始化 局部的变量要初始化 属性有默认的值 所以我们不必须对于属性进行初始化 我之前遇到的一个BUG就是int类型没有初始化给我默认Nan造成崩溃 建议的写法 int...可能会出现大家想到一样的名字或者添加第三方库引入和第三方库名字一样 尽量加上前缀。...尽可能使用不可变的对象 对于OC存在很多可变的对象 比如NSMutableString NSMutableArray NSMutableDictionary等等 对于一些不允许改变的直接使用不可变对象...)写入垃圾值(garbage values),所以如果检查 error 的值可能导致错误 (甚至崩溃)。
1.Crash 捕获 根据 Crash 的不同来源,分为以下三类: 1.2.NSException 应用层的异常,未被捕获的异常,导致程序向自身发送了 SIGABRT 信号而崩溃,是应用程序自己可控的...(&UncaughtExceptionHandler); } // 崩溃时的回调函数 static void UncaughtExceptionHandler(NSException * exception...C++ 异常后会将其转换为 OC 异常抛出,此时的调用堆栈是在异常发生时的队长;但若转换失败则会调用 __cxa_throw 抛出异常,此时的调用队长是处理异常的堆栈,导致原始异常调用堆栈丢失。...crash KVC 的搜索模式详情可见:iOS_KVC:Key-Value Coding-2(访问者搜索模式),当最终找不到对应的key时,会导致 crash。...*dict = [NSMutableDictionary dictionary]; [dict setObject:nil forKey:@"xxx"]; // Thread 1: "*** -[__
setter方法会导致程序崩溃;或者当运行到 someVar = var时,由于缺getter方法同样会导致崩溃。...这个修饰符不会牵涉到内存管理,但是如果是对象类型,可能会导致内存泄漏或者EXC_BAD_ACCESS错误。 除了assign以外的其他修饰符,是必须用于修饰OC对象的。...所以assign修饰的OC属性是非常危险的,比如,一些老的第三方框架用assign修饰的delegate属性经常会导致崩溃。 4.2 retain 4.2.1 基本特性 retain: 指针拷贝。...如果该对象被释放,那么相应的实例变量会被自动赋为nil,不会变为悬空指针(也称野指针)。悬空指针指向的是不再存在的对象,向悬空指针发送消息通常会导致程序崩溃。...用于修饰NSMutableArray,NSMutableDictionary等copy无法修饰的属性。
所以可能会导致某个父类的initialize方法会被调用多次,为了避免这种情况,我们可以使用类型判等或dispatch_once()这两种方式,以保证initialize中的代码不会被无辜调用。...如果存在继承的情况下,很有可能导致崩溃。...} 【必须】和init方法一样,禁止在dealloc方法中使用self.xxx的方式访问属性。如果存在继承的情况下,很有可能导致崩溃。...开发中,当你走投无路将要崩溃时,可以考虑使用通知;而当你频繁使用通知时,同样会让你崩溃到走投无路。所以,在每个应用中,我们应该时刻留意并控制通知的数量,避免通知满天飞的现象。...【建议】合理组织工程的内的文件夹,工程中一般包括但不限于以下几个文件夹category(分类)、util/helper(工具类)、resource(资源)、const(常量)、third(第三方)。
领取专属 10元无门槛券
手把手带您无忧上云