Ios

NSAssertとNSAssertionHandler:アサーションは関連しています



Nsassert Nsassertionhandler



アサーションは条件を評価します。条件がfalseの場合は、現在のスレッドのブレークポイントハンドルを呼び出します。各スレッドには、NSAsserttionHandlerクラスのオブジェクトである独自のブレークポイントハンドルがあります。呼び出されると、アサーションハンドルは、メソッド名、クラス名、または関数名を含むエラーメッセージを出力します。次に、NSInternalInconsistencyExceptionをスローします。
アサーションは条件を評価し、条件がfalseと評価された場合は、現在のスレッドのアサーションハンドラーを呼び出して、フォーマット文字列と可変数の引数を渡します。各スレッドには、classNSAssertionHandlerのオブジェクトである独自のアサーションハンドラーがあります。アサーションハンドラーが呼び出されると、メソッド名とクラス名(または関数名)を含むエラーメッセージが出力されます。次に、NSInternalInconsistencyException例外が発生します。



このマクロは、Objective-Cメソッドの有効性を確認するために使用されます。パラメータを条件として指定するだけです。マクロはこのパラメーターを評価し、falseの場合、パラメーターを含むエラーログメッセージを出力して例外をスローします。
このマクロは、Objective-Cメソッドのパラメーターを検証します。パラメータを条件引数として指定するだけです。マクロはパラメーターを評価し、それがfalseの場合、パラメーターを含むエラーメッセージをログに記録してから、例外を発生させます。

前処理マクロNS_BLOCK_ASSERTIONSが定義されている場合、アサーションは無効になります。すべてのブレークポイントマクロはvoidを返します。
プリプロセッサマクロNS_BLOCK_ASSERTIONSが定義されている場合、アサーションは無効になります。すべてのアサーションマクロはvoidを返します。



NSAssertとassertはassertです。主な違いは、assertは、アサーションが失敗したときにプログラムを終了するだけであり、NSAssertはエラーメッセージを報告して出力することです。したがって、NSAssertを使用しているにもかかわらず、assertを使用することはできません。

iOSでは、NSAssert / NSCAssertとNSParameterAssert / NSCparameterAssertの2組のアサーションが最もよく使用されます。それらの違いを知るために、まずそれらの定義を見てみましょう。

//Record and print the assert log *** Assertion failure in -[AppDelegate application:didFinishLaunchingWithOptions:], /Users/admin/Desktop/storyboard/storyboard/AppDelegate.m:36 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'a must equal to 5

NSAssert / NSCAssert 両方とも



違いは定義によって見ることができます。前者はObjective-Cに適したメソッドであり、_cmdとselfはランタイムに関連しています。後者はCに適した関数です。

NSParameterAssert / NSCparameterAssertも前者とObjective-Cの違いですが、後者はC関数に適用できます。

NSAssert / NSCAssertとNSParameterAssert / NSCparameterAssertの違いは、前者はすべてアサーションであり、後者はパラメーターの存在のみを対象としているため、最初にパラメーターアサーションを作成してパラメーターが正しいことを確認してから、すべてのアサーションを他の理由を確認してください。

NSAssertの使用法

@interface MyAssertHandler : NSAssertionHandler @end NSAssertionHandler *myHandler = [[MyAssertHandler alloc] init] //To the current thread [[[NSThread currentThread] threadDictionary] setValue:myHandler forKey:NSAssertionHandlerKey]

NSParameterAssertの使用法

#if !defined(NS_BLOCK_ASSERTIONS) #if !defined(_NSAssertBody) #define NSAssert(condition, desc, ...)   do {   __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS   if (!(condition)) {    [[NSAssertionHandler currentHandler] handleFailureInMethod:_cmd    object:self file:[NSString stringWithUTF8String:__FILE__]     lineNumber:__LINE__ description:(desc), ##__VA_ARGS__]   }    __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS   } while(0) #endif #if !defined(_NSCAssertBody) #define NSCAssert(condition, desc, ...)   do {   __PRAGMA_PUSH_NO_EXTRA_ARG_WARNINGS   if (!(condition)) {    [[NSAssertionHandler currentHandler] handleFailureInFunction:[NSString stringWithUTF8String:__PRETTY_FUNCTION__]    file:[NSString stringWithUTF8String:__FILE__]     lineNumber:__LINE__ description:(desc), ##__VA_ARGS__]   }    __PRAGMA_POP_NO_EXTRA_ARG_WARNINGS   } while(0) #endif 
int a = 4 NSAssert(a == 5, @'a must equal to 5') //The first parameter is the condition, if the first parameter does not meet the condition, the second parameter will be recorded and printed

Xcodeはデフォルトでリリース環境のアサーションをキャンセルし、アサーションを閉じるのを忘れることによって引き起こされるプログラムの不安定さを回避します。

NSAssertionHandler:カスタム処理メソッド。プログラムは直接クラッシュしません

NSAssertionHandlerインスタンスは、エラーアサーションを処理するために自動的に作成されます。 NSAssertおよびNSCAssert条件がエラーとして評価された場合、エラーを表す文字列がNSAssertionHandlerインスタンスに送信されます。各スレッドには、NSAssertionHandlerの独自のインスタンスがあります。

NSAssertionHandlerのカスタムサブクラス

|_+_|
- (void)assertWithPara:(NSString *)str { NSParameterAssert(str) //Only one parameter is required, if the parameter exists, the program continues to run, if the parameter is empty, the program stops printing the log //further code ... }

スレッドに処理クラスを追加します

// If str is empty, there is a log similar to the following *** Assertion failure in -[AppDelegate assertWithPara:], /Users/admin/Desktop/storyboard/storyboard/AppDelegate.m:45<pre name='code' class='objc'>*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: str'

これらを実装した後、プログラムはアサーションが失敗した後に情報を取得できますが、プログラムは実行を継続する可能性があり、プログラムを強制的に終了することはありません。

転載:https://www.cnblogs.com/YH-Coding/p/5314737.html