你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS開發Foundation中的斷言處置

iOS開發Foundation中的斷言處置

編輯:IOS開發綜合

Foundation中定義了兩組斷言的宏,辨別是:

    NSAssert / NSCAssert
    NSParameterAssert / NSCParameterAssert

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

1、假如我們需求確保辦法或函數的輸出參數的正確性,則應該在辦法(函數)的頂部運用NSParameterAssert / NSCParameterAssert;而在其它狀況下,運用NSAssert / NSCAssert。 2、另一個不同是介於C和Objective-C之間。NSAssert / NSParameterAssert應該用於Objective-C的上下文(辦法)中,而NSCAssert / NSCParameterAssert應該用於C的上下文(函數)中。

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

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

Foundation 為了處置斷言,專門定義了一個NSAssertionHandler來處置斷言的失敗狀況。NSAssertionHandler對象是自動創立的,用於 處置失敗的斷言。當斷言失敗時,會傳遞一個字符串給NSAssertionHandler對象來描繪失敗的緣由。每個線程都有自己的 NSAssertionHandler對象。當調用時,一個斷言處置器會打印包括辦法和類(或函數)的錯誤音訊,並引發一個 NSInternalInconsistencyException異常。好像下面所看到的一樣。

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

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

①
// 前往與以後線程的NSAssertionHandler對象。
// 假如以後線程沒有相關的斷言處置器,則該辦法會創立一個並指定給以後線程
+ (NSAssertionHandler *)currentHandler;
②
// 當NSCAssert或NSCParameterAssert斷言失敗時,會調用這個辦法
- (void)handleFailureInFunction:(NSString *)functionName file:(NSString *)object lineNumber:(NSInteger)fileName description:(NSString *)line, format,...
③
// 當NSAssert或NSParameterAssert斷言失敗時,會調用這個辦法
- (void)handleFailureInMethod:(SEL)selector object:(id)object file:(NSString *)fileName lineNumber:(NSInteger)line description:(NSString *)format, ...

另外,還定義了一個常量字符串,次要是用於在線程的threadDictionary字典中獲取或設置斷言處置器。

NSString * const NSAssertionHandlerKey;

我們可以自定義一個承繼自NSAssertionHandler的斷言處置類,來完成一些我們自己的需求。如Mattt Thompson的NSAssertionHandler實例一樣:

@interface LoggingAssertionHandler : NSAssertionHandler
@end
@implementation LoggingAssertionHandler

- (void)handleFailureInMethod:(SEL)selector
                       object:(id)object
                         file:(NSString *)fileName
                   lineNumber:(NSInteger)line
                  description:(NSString *)format, ...{
    NSLog(@"NSAssert Failure: Method %@ for object %@ in %@#%i", NSStringFromSelector(selector), object, fileName, line);
}
- (void)handleFailureInFunction:(NSString *)functionName
                           file:(NSString *)fileName
                     lineNumber:(NSInteger)line
                    description:(NSString *)format, ...{
    NSLog(@"NSCAssert Failure: Function (%@) in %@#%i", functionName, fileName, line);
}
@end

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

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    NSAssertionHandler *assertionHandler = [[LoggingAssertionHandler alloc] init];
    [[[NSThread currentThread] threadDictionary] setValue:assertionHandler
                                                   forKey:NSAssertionHandlerKey];
    return YES;
}

【iOS開發Foundation中的斷言處置】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved