转载自 http://www.jianshu.com/p/05aad21e319e

iOS被开发者遗忘在角落的NSException-其实它很强大

字数597 阅读968 评论4 喜欢28

NSException是什么?

最熟悉的陌生人,这是我对NSException的概述,为什么这么说呢?其实很多开发者接触到NSException的频率非常频繁,但很多人都不知道什么是NSException,不知道如何使用NSException。下面从一张截图开始讲起NSException。

崩溃截图.png

上面这张图想必大家都不陌生吧!(卧槽,程序又崩溃了)。

其实控制台输出的日志信息就是NSException产生的,一旦程序抛出异常,程序就会崩溃,控制台就会有这些崩溃日志。


NSException的基本用法

下面代码就会让你的程序崩溃

  1. //异常的名称
  2. NSString *exceptionName = @"自定义异常";
  3. //异常的原因
  4. NSString *exceptionReason = @"我长得太帅了,所以程序崩溃了";
  5. //异常的信息
  6. NSDictionary *exceptionUserInfo = nil;
  7. NSException *exception = [NSException exceptionWithName:exceptionName reason:exceptionReason userInfo:exceptionUserInfo];
  8. NSString *aboutMe = @"太帅了";
  9. if ([aboutMe isEqualToString:@"太帅了"]) {
  10. //抛异常
  11. @throw exception;
  12. }

崩溃截图如下

自定义异常崩溃截图.png

为什么说NSException很强大

NSException掌控着程序的生命,程序的崩溃就是NSException来控制的,你说NSException不强大吗?那为何要NSException来使程序崩溃呢?其实主要的出发点是让开发者认识到哪里的代码有问题。

下面说两个NSException的实用技巧吧

  • 1、 若自己封装一套SDK,若要提示哪里出错,那么就可以使用NSException。就像上面NSException的基本用法中的代码一样。
  • 2、可以用来捕获异常,防止程序的崩溃。当你意识到某段代码可能存在崩溃的危险,那么你就可以通过捕获异常来防止程序的崩溃。代码如下
  1. NSString *nilStr = nil;
  2. NSMutableArray *arrayM = [NSMutableArray array];
  3. @try {
  4. //如果@try中的代码会导致程序崩溃,就会来到@catch
  5. //将一个nil插入到可变数组中,这行代码肯定有问题
  6. [arrayM addObject:nilStr];
  7. }
  8. @catch (NSException *exception) {
  9. //如果@try中的代码有问题(导致崩溃),就会来到@catch
  10. //在这里你可以进行相应的处理操作
  11. //如果你要抛出异常(让程序崩溃),就写上 @throw exception
  12. }
  13. @finally {
  14. //@finally中的代码是一定会执行的
  15. //你可以在这里进行一些相应的操作
  16. }
  • 3、最最实用的一个技术点就是利用 分类(category) + runtime + 异常的捕获 来防止Foundation一些常用方法使用不当而导致的崩溃。其原理就是利用category、runtime来交换两个方法,并且在方法中捕获异常进行相应的处理。(这里需要了解一些关于runtime的知识点,若对runtime不熟悉的朋友,可以先去了解下runtime的方法交换)。下面直接附上大概的使用方法。

添加分类,利用runtime交换方法

  1. //
  2. // NSMutableArray+Extension.m
  3. // categoryTest
  4. //
  5. // Created by mac on 16/10/6.
  6. // Copyright © 2016年 chenfanfang. All rights reserved.
  7. //
  8. #import "NSMutableArray+Extension.h"
  9. #import <objc/runtime.h>
  10. @implementation NSMutableArray (Extension)
  11. + (void)load {
  12. Class arrayMClass = NSClassFromString(@"__NSArrayM");
  13. //获取系统的添加元素的方法
  14. Method addObject = class_getInstanceMethod(arrayMClass, @selector(addObject:));
  15. //获取我们自定义添加元素的方法
  16. Method avoidCrashAddObject = class_getInstanceMethod(arrayMClass, @selector(avoidCrashAddObject:));
  17. //将两个方法进行交换
  18. //当你调用addObject,其实就是调用avoidCrashAddObject
  19. //当你调用avoidCrashAddObject,其实就是调用addObject
  20. method_exchangeImplementations(addObject, avoidCrashAddObject);
  21. }
  22. - (void)avoidCrashAddObject:(id)anObject {
  23. @try {
  24. [self avoidCrashAddObject:anObject];//其实就是调用addObject
  25. }
  26. @catch (NSException *exception) {
  27. //能来到这里,说明可变数组添加元素的代码有问题
  28. //你可以在这里进行相应的操作处理
  29. NSLog(@"异常名称:%@ 异常原因:%@",exception.name, exception.reason);
  30. }
  31. @finally {
  32. //在这里的代码一定会执行,你也可以进行相应的操作
  33. }
  34. }
  35. @end

验证上面的代码的确可以捕获异常,并且不会崩溃

  1. NSString *nilStr = nil;
  2. NSMutableArray *arrayM = [NSMutableArray array];
  3. [arrayM addObject:nilStr];

控制台输出截图如下

捕获到的异常信息.png

利用category + runtime + 异常的捕获 来写一个防止崩溃的框架

(转)iOS被开发者遗忘在角落的NSException-其实它很强大的更多相关文章

  1. iOS被开发者遗忘在角落的NSException-其实它很强大

    NSException是什么? 最熟悉的陌生人,这是我对NSException的概述,为什么这么说呢?其实很多开发者接触到NSException的频率非常频繁,但很多人都不知道什么是NSExcepti ...

  2. iOS开发--开发者帐号

    iOS应用上线 http://www.jianshu.com/p/ffddc5e5f0b9 http://www.jianshu.com/p/986e02d38f1b 好不容易终于申请下来了ios 公 ...

  3. 信息图:iOS 7开发者需要知道的事

      如果你想为iOS 设备开发app,你需要知道如何与软件交互,如何设计,你还要知道苹果独特的开发理念和开发工具.真正的能力还需要成功地从其他行业领域借鉴核心概念.最后把所有这些东西糅合进你的信息库中 ...

  4. ios标准开发者账号 ios企业开发者账号的区别总结

    ios标准开发者账号 ios企业开发者账号的区别总结   ios标准开发者项目 1.ios标准开发者项目账号可以发布到app store 2.ios标准开发者项目分为两种:①个人开发者②公司/机构开发 ...

  5. iOS 公司开发者账号申请

    苹果开发者账号分三种. 个人账号:个人申请用于开发苹果app所使用的账号,仅限于个人使用,申请比较容易,$99. 公司账号:以公司的名义申请的开发者账号,用于公司内部的开发者共用,$99. 企业账号: ...

  6. IOS公司开发者账号申请详细教程

    谈到苹果开发者账号,我们需要区分一下个人账号.公司账号和企业账号这三种,还有一种是教育账号,这个就不多说了. 个人账号:个人申请用于开发苹果app所使用的账号,仅限于个人使用,申请比较容易,$99. ...

  7. iOS企业级开发者计划的申请流程

    第一步:访问苹果企业版iDP网址:https://developer.apple.com/programs/ios/enterprise/点击Apply Now按钮,开始申请流程. 第二步:点击App ...

  8. IOS公司开发者账号申请详细教程--1 备用

    谈到苹果开发者账号,我们需要区分一下个人账号.公司账号和企业账号这三种,还有一种是教育账号,这个就不多说了. 个人账号:个人申请用于开发苹果app所使用的账号,仅限于个人使用,申请比较容易,$99. ...

  9. iOS企业开发者账号实现内部分发

    前言 上个月由于公司开发的棋牌类游戏接近尾声,需要大量的苹果测试机来支持,之前只有一个公司开发者账号,每添加新的测试机都需要添加一次UDID,做了不少无用功,再加上本身外包性质的公司导致客户方面频繁更 ...

随机推荐

  1. 数学类杂志SCI2013-2014影响因子

    ISSN Abbreviated Journal Title Full Title Category Subcategory Country total Cites IF        2013-20 ...

  2. HDU- 2265 Encoding The Diary

    Encoding The Diary Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  3. 作品第一课----获取批量checkbox选中的值

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. nyoj 37回文串

    述所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串.现在要求你,给你一个字符串,可 ...

  5. Mac下快捷键列表

    主界面 command + tab 切换程序 command + ` 在程序内切换界面 command + w 关闭界面 command + q 关闭程序 command + option + esc ...

  6. Bzoj 1609: [Usaco2008 Feb]Eating Together麻烦的聚餐 二分

    1609: [Usaco2008 Feb]Eating Together麻烦的聚餐 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1272  Solve ...

  7. linux下在多个文件夹中查找指定字符串的命令

    例如,想要在当前文件夹下的多个.c或者.txt文件中查找“shutdown”字符串, 可以使用“grep shutdown ./*.c”或“grep shutdown ./*.txt”即可 使用fin ...

  8. hdoj 1286 找新朋友【欧拉函数】

    找新朋友 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  9. Expression Blend 4 激活码

    Expression Blend 4 激活码: 6WDDQ-K7D4F-GQGF4-2VYBJ-8K6MB

  10. Windows操作系统的历史

    30 years ago Windows was first released, see how much it has changed回顾了Windows操作系统的历史. 1985, Windows ...