成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

2017-08-28 15:21:29

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

2022-07-19 08:01:55

函數Go格式化

2025-05-22 09:01:28

2019-09-20 08:47:57

DockerLinux軟件

2019-09-23 11:07:00

PythonRedis軟件

2010-07-26 15:12:20

坐標變換

2011-08-17 17:46:21

2013-04-07 10:01:26

Java異常處理

2017-11-07 13:24:38

Pythontime模塊datetime

2022-06-09 10:42:47

GoJSON

2009-01-05 09:14:17

.NETcatch性能損失

2013-12-16 17:17:01

OpenMp數據處理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 热99在线 | 在线视频国产一区 | 欧美日韩看片 | 亚洲另类春色偷拍在线观看 | 人人擦人人 | 欧美一级免费观看 | 久久99精品久久久久 | 91资源在线 | 精品毛片 | 国产欧美日韩一区二区三区在线观看 | 成人精品区 | 欧美精品一区二区三区在线 | 91污在线| 日本成人中文字幕 | 亚洲自拍一区在线观看 | 九七午夜剧场福利写真 | 亚洲美女一区二区三区 | www.国产精品 | 韩日精品视频 | 久久久久国产精品午夜一区 | 草久久免费视频 | 成人在线精品视频 | 综合久久久久 | 日本亚洲精品 | 亚洲 欧美 在线 一区 | 手机av在线 | 欧美精品99 | 91文字幕巨乱亚洲香蕉 | 亚洲精品国产区 | 中文字幕不卡在线观看 | 精品国产欧美一区二区三区不卡 | 欧美xxxx日本 | av激情在线| 一区二区久久精品 | 欧美日韩视频在线播放 | 欧美精品一区二区三区四区 在线 | 欧美激情一区二区三级高清视频 | 91n成人 | 国产伦精品一区二区三区照片91 | 99精品视频在线 | 99看片网 |