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