国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Foundation中的斷言處理

移動開發 iOS
經常在看一些第三方庫的代碼時,或者自己在寫一些基礎類時,都會用到斷言。所以在此總結一下Objective-C中關于斷言的一些問題。

Foundation中的斷言處理

經常在看一些第三方庫的代碼時,或者自己在寫一些基礎類時,都會用到斷言。所以在此總結一下Objective-C中關于斷言的一些問題。

Foundation中定義了兩組斷言相關的宏,分別是:

  1. NSAssert / NSCAssert 
  2. NSParameterAssert / NSCParameterAssert 

這兩組宏主要在功能和語義上有所差別,這些區別主要有以下兩點:

如果我們需要確保方法或函數的輸入參數的正確性,則應該在方法(函數)的頂部使用NSParameterAssert / NSCParameterAssert;而在其它情況下,使用NSAssert / NSCAssert。

另一個不同是介于C和Objective-C之間。NSAssert / NSParameterAssert應該用于Objective-C的上下文(方法)中,而NSCAssert / NSCParameterAssert應該用于C的上下文(函數)中。

當斷言失敗時,通常是會拋出一個如下所示的異常:

  1. *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'true is not equal to false' 

Foundation為了處理斷言,專門定義了一個NSAssertionHandler來處理斷言的失敗情況。NSAssertionHandler對象是自動創建的,用于處理失敗的斷言。當斷言失敗時,會傳遞一個字符串給NSAssertionHandler對象來描述失敗的原因。每個線程都有自己的NSAssertionHandler對象。當調用時,一個斷言處理器會打印包含方法和類(或函數)的錯誤消息,并引發一個NSInternalInconsistencyException異常。就像上面所看到的一樣。

我們很少直接去調用NSAssertionHandler的斷言處理方法,通常都是自動調用的。

NSAssertionHandler提供的方法并不多,就三個,如下所示:

  1. // 返回與當前線程的NSAssertionHandler對象。 
  2. // 如果當前線程沒有相關的斷言處理器,則該方法會創建一個并指定給當前線程 
  3. + (NSAssertionHandler *)currentHandler 
  4.  
  5. // 當NSCAssert或NSCParameterAssert斷言失敗時,會調用這個方法 
  6. - (void)handleFailureInFunction:(NSString *)functionName file:(NSString *)object lineNumber:(NSInteger)fileName description:(NSString *)line, format,... 
  7.  
  8. // 當NSAssert或NSParameterAssert斷言失敗時,會調用這個方法 
  9. - (void)handleFailureInMethod:(SEL)selector object:(id)object file:(NSString *)fileName lineNumber:(NSInteger)line description:(NSString *)format, ...

另外,還定義了一個常量字符串,

  1. NSString * const NSAssertionHandlerKey; 

主要是用于在線程的threadDictionary字典中獲取或設置斷言處理器。

關于斷言,還需要注意的一點是在Xcode 4.2以后,在release版本中斷言是默認關閉的,這是由宏NS_BLOCK_ASSERTIONS來處理的。也就是說,當編譯release版本時,所有的斷言調用都是無效的。

我們可以自定義一個繼承自NSAssertionHandler的斷言處理類,來實現一些我們自己的需求。如Mattt Thompson的NSAssertion​Handler實例一樣:

  1. @interface LoggingAssertionHandler : NSAssertionHandler 
  2. @end 
  3.  
  4. @implementation LoggingAssertionHandler 
  5.  
  6. - (void)handleFailureInMethod:(SEL)selector 
  7. object:(id)object 
  8. file:(NSString *)fileName 
  9. lineNumber:(NSInteger)line 
  10. description:(NSString *)format, ... 
  11. NSLog(@"NSAssert Failure: Method %@ for object %@ in %@#%i", NSStringFromSelector(selector), object, fileName, line); 
  12.  
  13. - (void)handleFailureInFunction:(NSString *)functionName 
  14. file:(NSString *)fileName 
  15. lineNumber:(NSInteger)line 
  16. description:(NSString *)format, ... 
  17. NSLog(@"NSCAssert Failure: Function (%@) in %@#%i", functionName, fileName, line); 
  18.  
  19. @end

上面說過,每個線程都有自己的斷言處理器。我們可以通過為線程的threadDictionary字典中的NSAssertionHandlerKey指定一個新值,來改變線程的斷言處理器。

如下代碼所示:

  1. - (BOOL)application:(UIApplication *)application 
  2. didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
  3. NSAssertionHandler *assertionHandler = [[LoggingAssertionHandler alloc] init]; 
  4. [[[NSThread currentThread] threadDictionary] setValue:assertionHandler 
  5. forKey:NSAssertionHandlerKey]; 
  6. // ... 
  7.  
  8. return YES; 
  9. }

而什么時候應該使用斷言呢?通常我們期望程序按照我們的預期去運行時,如調用的參數為空時流程就無法繼續下去時,可以使用斷言。但另一方面,我們也需要考慮,在這加斷言確實是需要的么?我們是否可以通過更多的容錯處理來使程序正常運行呢?

Mattt Thompson在NSAssertion​Handler中的倒數第二段說得挺有意思,在此摘抄一下:

But if we look deeper into NSAssertionHandler—and indeed, into our own hearts, there are lessons to be learned about our capacity for kindness and compassion; about our ability to forgive others, and to recover from our own missteps. We can't be right all of the time. We all make mistakes. By accepting limitations in ourselves and others, only then are we able to grow as individuals.

參考

NSAssertion​Handler

NSAssertionHandler Class Reference

責任編輯:chenqingxiang 來源: 南峰子的技術博客
相關推薦

2021-07-27 06:06:34

TypeScript語言運算符

2010-06-03 09:58:46

Linux 測試軟件

2023-10-29 16:18:26

Go接口

2011-07-07 09:54:01

Cocoa Core Foundation

2010-11-02 10:44:12

2009-06-17 17:09:02

Java異常Java斷言

2012-01-12 15:36:12

響應式Web設計

2010-12-27 15:17:07

SharePoint

2010-07-26 15:12:20

坐標變換

2019-09-20 08:47:57

DockerLinux軟件

2025-05-22 09:01:28

2019-09-23 11:07:00

PythonRedis軟件

2017-08-28 15:21:29

異步處理回調函數異步編程

2022-07-19 08:01:55

函數Go格式化

2025-10-29 09:38:30

2012-09-13 11:15:57

IBMdw

2020-07-02 22:42:18

Java異常編程

2009-06-25 14:05:40

Java應用技巧

2023-11-30 07:15:36

GolangRecover

2010-09-10 14:26:06

SQLFor循環
點贊
收藏

51CTO技術棧公眾號

成年人在线视频免费观看| 国产成人三级在线观看| 日本最新高清不卡中文字幕| 久久综合另类图片小说| 日本高清+成人网在线观看| 精品一区不卡| 国产精品乱码一区二区三区| 亚洲第一区色| 亚洲精品欧美精品| 成人精品视频网站| av网站免费在线| 欧美丝袜丝交足nylons图片| 伊人手机在线| 久久精品国产电影| 蜜桃成人av| 国产精品一区二区三区观看| 日韩不卡一区二区三区| 每日在线更新av| 香蕉影视欧美成人| 高h视频在线播放| 久久免费视频网站| 三级在线视频观看| 国产精品美女www爽爽爽| 性网站在线播放| 精品国产精品网麻豆系列 | 日韩av综合| 成人精品一区二区三区电影黑人| 午夜在线视频观看日韩17c| 欧美乱大交xxxxx潮喷l头像| 亚洲欧美一区二区久久| 超碰人人在线| 欧美剧在线观看| 亚洲精品四区| 国产超碰在线播放| 欧美一级片在线看| 四虎影视精品| www亚洲国产| 大伊人狠狠躁夜夜躁av一区| 日韩电影免费观| 亚洲自拍高清视频网站| 成人精品视频网站| av在线天堂| 2019中文字幕在线免费观看| 青青草国产精品97视觉盛宴| av首页在线| 一本一本久久a久久精品牛牛影视| 手机亚洲手机国产手机日韩| 欧美久久在线观看| 欧美视频一区二| 欧美大胆视频| 亚洲理论电影在线观看| 欧美酷刑日本凌虐凌虐| 欧美日韩精品一区二区三区在线观看| 视频二区一区| 欧美日韩国产综合新一区| 久久精品 人人爱| 鲁片一区二区三区| 亚洲一区二区黄色| 成人免费91| 一卡二卡3卡四卡高清精品视频| 亚洲成人在线网站| 国产亚洲亚洲国产一二区| 青青草国产精品| 欧美日韩人人澡狠狠躁视频| 老司机亚洲精品一区二区| 日韩性感在线| 欧美色涩在线第一页| 天堂99x99es久久精品免费| 国产911在线观看| 91精品国产综合久久久久久漫画| 国产精品免费大片| 538在线视频观看| 国产一区二区三区日韩欧美| 久久视频www| 久久九九国产精品怡红院| 麻豆免费看一区二区三区| aaa日本高清在线播放免费观看| 欧美亚州一区二区三区| 99精品久久只有精品| 国产社区精品视频| 日本欧美精品久久久| 日本久久电影网| 日韩情爱电影在线观看| 亚洲免费看av| 久久久精品久久| 成人ar影院免费观看视频| 自拍在线观看| 欧美黄色免费网址| 亚洲欧美变态国产另类| 青青草成人在线观看| av软件在线观看| 日韩久久不卡| 亚洲第一精品福利| 日本不卡在线视频| www欧美xxxx| 国产三级中文字幕| 亚洲欧美日韩精品久久| 国产一区二区中文字幕| 丝袜老师在线| 日韩视频免费播放| 欧美大片免费观看在线观看网站推荐 | 99免费精品视频| 激情亚洲小说| 免费在线激情视频| 欧美激情一级精品国产| 国产精品国产三级国产aⅴ入口| 日韩一区二区三区色| 99re在线视频免费观看| 九九久久综合网站| 亚洲欧洲av在线| 欧美综合另类| 久久久pmvav| 色狠狠久久av五月综合| 日韩av在线精品| 99久久综合国产精品| 久久porn| 校园春色综合| 欧美一区二区三区四区夜夜大片| 欧美videos大乳护士334| 国产精品一区一区三区| 亚洲精品大全| 黄色av免费| 97免费资源站| 亚洲精品国产综合久久| 91在线观看免费视频| 亚洲影院天堂中文av色| 日本私人网站在线观看| 久久涩涩网站| 日韩av高清在线观看| 黄色成年人视频在线观看| 亚洲mv在线看| 欧美成人精品一区二区| 亚洲在线观看免费视频| 日韩午夜黄色| 久久日本片精品aaaaa国产| av毛片免费看| 国产自产在线视频一区| 亚洲视屏在线播放| 1区2区3区国产精品| 欧美影院一区| 成人做爰免费视频免费看| 视频在线国产| 小说区图片区图片区另类灬| 久久精品视频亚洲| 色综合天天综合网天天看片| 美腿丝袜亚洲三区| 欧美综合自拍| 狂野欧美性猛交xxxxx视频| 天天碰免费视频| 精品蜜桃一区二区三区| 最新亚洲国产精品| 福利精品视频在线| 丁香网亚洲国际| 99久久久久国产精品| 日韩激情电影免费看| 日日噜噜噜夜夜爽爽狠狠| 欧美亚洲国产免费| 久久人人爽人人爽人人片av高请| 欧美日韩你懂得| 国产三级一区二区三区| 一二三区精品| 欧美黑人巨大videos精品| 1区2区3区在线视频| 在线观看国产一级片| 蜜桃久久影院| 日韩av123| 亚洲视频精品在线| 欧洲一区二区三区在线| 国产校园另类小说区| 老司机精品导航| 精品日本12videosex| 91精品店在线| 蜜桃av在线免费观看| 爆操妹子视频在线观看| 国产91porn| 国产精品一区二区三区观看 | 精品国产鲁一鲁****| 天天影视久久综合| 欧美wwwwwww| 成人免费看片'免费看| 999国产在线| 91av视频在线| 亚洲天堂免费视频| 欧美另类videos死尸| 一区二区三区成人在线视频| 东方aⅴ免费观看久久av| 在线成人av| 婷婷成人综合| 国语精品免费视频| 欧美一区二区三区免费观看| 亚洲人成网站色ww在线| 欧美午夜理伦三级在线观看| 亚洲欧美影音先锋| 99re8在线精品视频免费播放| 爽好久久久欧美精品| 欧美二区不卡| 日韩高清欧美| 美女少妇全过程你懂的久久| 四虎影视精品永久在线观看| 美女高潮在线观看|