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

转载自 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 + 异常的捕获 来写一个防止崩溃的框架

时间: 2024-10-13 08:01:00

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

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

ios标准开发者项目 1.ios标准开发者项目账号可以发布到app store 2.ios标准开发者项目分为两种:①个人开发者②公司/机构开发者 其中②公司/机构开发者项目账号可以添加多达100台设备账号. 3.标准开发者账号可以同时作为mac app store的开发者账号,只需交钱即可. ios企业开发者项目账号 1.加入企业开发者项目的账号只能是拥有DUNS编号的企业才能申请 2.企业开发者项目只能发布供内部使用的ios程序 3.企业开发者项目发布的程序不能放在app store, 必须另

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

谈到苹果开发者账号,我们需要区分一下个人账号.公司账号和企业账号这三种,还有一种是教育账号,这个就不多说了. 个人账号:个人申请用于开发苹果app所使用的账号,仅限于个人使用,申请比较容易,$99. 公司账号:以公司的名义申请的开发者账号,用于公司内部的开发者共用,申请流程相对比较麻烦一下,$99. 企业账号:一般是公司规模在500人以上的企业,用于内部测试发布的账号,该账号发布的应用不发布在appstore上.$299. 介于这几天忙于公司账号的申请,我把详细的申请过程经历,包括容易放的错误,

iOS开发--开发者帐号

iOS应用上线 http://www.jianshu.com/p/ffddc5e5f0b9 http://www.jianshu.com/p/986e02d38f1b 好不容易终于申请下来了ios 公司开发者账号,真是一路艰辛和漫长啊,特别是对于远在大洋彼岸的大中华国家.以下我就分享一下这一路下来的经验,希望对于那些新手同仁们有所帮助. iso开发者账号分为 个人(individual),公司(company),企业(enterprise)三种类型.个人账号只能有一个开发者,公司账号可以允许多个

IOS 公司开发者账号申请详细教程---【转载】

IOS 公司开发者账号申请详细教程 谈到苹果开发者账号,我们需要区分一下个人账号.公司账号和企业账号这三种,还有一种是教育账号,这个就不多说了. 个人账号:个人申请用于开发苹果app所使用的账号,仅限于个人使用,申请比较容易,$99. 公司账号:以公司的名义申请的开发者账号,用于公司内部的开发者共用,申请流程相对比较麻烦一下,$99. 企业账号:一般是公司规模在500人以上的企业,用于内部测试发布的账号,该账号发布的应用不发布在appstore上.$299. 介于这几天忙于公司账号的申请,我把详

iOS公司开发者账号的申请详细教程(转)

下面就是关于iOS公司开发者账号的申请详细教程: 一.苹果开发者账号申请链接地址:https://developer.apple.com/programs/ios/.打开链接如下: 1. 点击Enroll Now,进入申请页面 2. 上面的页面主要介绍了申请的流程,都是英文,英文好的可以看看,不想看的直接点Continue,进入下一页面 可以直接点Continue,没有的话点击Create Apple ID去创建一个新的apple id.注意:创建apple id时填写的Name一栏一定要填写真

iOS的开发者的webview的js性能比Safari性能差5、6倍

在项目中遇到了个问题就是,iOS的webview的性能比安卓的烂机器还差,找了一大圈,终于找到原因了... 1. 自己测试的结果 2. 网上的评测,safari和用webview的chrome对比 http://www.36kr.com/p/123075.htm 3. iOS8将会开放新的js引擎 http://tech2ipo.com/66193 iOS的开发者的webview的js性能比Safari性能差5.6倍

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

谈到苹果开发者账号,我们需要区分一下个人账号.公司账号和企业账号这三种,还有一种是教育账号,这个就不多说了. 个人账号:个人申请用于开发苹果app所使用的账号,仅限于个人使用,申请比较容易,$99. 公司账号:以公司的名义申请的开发者账号,用于公司内部的开发者共用,申请流程相对比较麻烦一下,$99. 企业账号:一般是公司规模在500人以上的企业,用于内部测试发布的账号,该账号发布的应用不发布在appstore上.$299. 介于这几天忙于公司账号的申请,我把详细的申请过程经历,包括容易放的错误,

IOS如果将一个十六进制的color转换成UIColor,很实用

UI给开发的效果图很多时候标注着十六进制的Color,而程序中用到的往往是UIColor可以用如下方法去转换: (UIColor *)RGBColorFromHexString:(NSString *)color alpha:(float)alpha { //color的值类似#fffeee,alpha的值类似1.0为透明度 int nums[6] = {0}; for (int i = 1; i < [color length]; i++) { int temp = [color charac

ios 企业级开发者账号app网页分发流程

准备: *一台运行着OSX的苹果电脑,最新版的XCODE,用于导出ipa和plist 一个HTML网页文件(告知iphone如何找到itms-services,已附上) 一个HTTP服务器(存放APP的服务器,就是提供ipa流量的服务器) 一款云存储(以七牛云存储为例,用于推送plist),建议升级到标准版用户,操作非常简单 备选: 一张二维码,一份自动分辨IOS设备的JS脚本 PS: 从2014年6月开始,网上的教程都变得不太好用了,原因有两个: 从IOS7.1开始,http推送plist已经