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

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

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

NSException是什么?

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

崩溃截图.png

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

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


NSException的基本用法

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

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

崩溃截图如下

自定义异常崩溃截图.png

为什么说NSException很强大

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

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

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

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

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

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

    NSString *nilStr = nil;
NSMutableArray *arrayM = [NSMutableArray array];
[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. Ora-12154:无法解析连接字符串

    服务器的环境为: 系统:Windows server 2008 64位 数据库:Oracle 10g WEB应用服务:IIS 7.0+.Net Framework 4.0 解决方法 Toad for ...

  2. jQuery 参考手册 - 文档操作

    上传图片时页面崩溃..全部付之东流 addClass() after() append() appendTo() attr() before() clone() detach() empty() ha ...

  3. Bzoj 3339: Rmq Problem && Bzoj 3585: mex 莫队,树状数组,二分

    3339: Rmq Problem Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 833  Solved: 397[Submit][Status][D ...

  4. 转载: pyExcelerator(Python操作Excel内库)API 文档

    1.pyExcelerator 主要通过俩个Object操作Excel: Workbook 和Worksheet2.pyExcelerator 读取Excel文件 parase_xls(filenam ...

  5. Ruby on Rails Session 1: How to Build a Ruby on Rails on the Ubuntu.

    About Ruby on Rails Ruby on Rails is an application stack that provides developers with a framework ...

  6. 4 weekend110的textinputformat对切片规划的源码分析 + 倒排索引的mr实现 + 多个job在同一个main方法中提交

    好的,现在,来weekend110的textinputformat对切片规划的源码分析, Inputformat默认是textinputformat,一通百通. 这就是今天,weekend110的te ...

  7. HTML5 Canvas 颜色填充学习

    ---恢复内容开始--- 如果我们想要给图形上色,有两个重要的属性可以做到:fillStyle 和 strokeStyle. fillStyle = color strokeStyle = color ...

  8. hdoj 1054 Strategic Game【匈牙利算法+最小顶点覆盖】

    Strategic Game Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  9. 单点登录SSO的实现原理

    单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任.单点登录在大型网站里使用得 ...

  10. textarea在光标位置插入文字

    最近开发类似计算器界面,需要在textarea中编辑公式,涉及到 在光标位置插入 字符. 效果如下: + - * / 添加文字 // html代码如下: <!doctype html> & ...