利用NSException iPhoneアプリ
-
29-09-2019 - |
質問
私の友人が私を使用しないNSException iPhoneアプリとなります。理由はたった"性能ボトルネック".でも私は確信します。
で誰かを確認しなければいけないと思い抑制を利用NSException iPhoneアプリ?場合のためのベスト-プラクティスをNSExceptionください提供しています。
更新:
この リンク ご要望に例外処理、アプリケーションです。してくれるよう頼む〔頼む〕have someoneされたのですか?くのメリットもその他の性能滑できます。
解決
要するに:
例外を使用して、回復可能なエラー以外のものを示すことはありません
@try/ @catchを使用して、回復不可能なエラーに対処することのみが適切です。 @throw/@@try/@catchを使用することは決して適切ではありません。IOSまたはMac OS Xでの操作のようなコントロールフローを行うことは、例外を使用して回復不可能なエラーを示すか、単にクラッシュする方が良いかどうかを慎重に検討してください( abort())を呼び出します;多くの場合、crash落により、より多くの証拠が残ります。
たとえば、目標がそれらをキャッチし、エラーを何らかの形で報告することである場合を除き、バインド外の例外をキャッチするために使用することは適切ではありません。一貫性のない状態にあり、データを失う可能性があります。
システムフレームワークコードを介してスローされた例外の動作は未定義です。
「システムフレームワークコードを介してスローされた例外の動作は未定義です」と説明できます。詳細に?
もちろん。
システムフレームワークは、任意の例外が致命的で、回復不可能なエラーと見なされるデザインを使用します。すべての意図と目的のためのプログラマーエラー。この規則には非常に限られた数の例外(HEH)があります。
したがって、その実装では、システムフレームワークコードを通過する例外が投げられた場合、システムフレームワークは必ずしも適切にクリーンアップされることを保証しません。サイン例外は、定義上、回復不能であり、なぜクリーンアップのコストを支払うのですか?
このコールスタックを考えてみましょう:
your-code-1()
system-code()
your-code-2()
IEコードは、コードがより多くのコードを呼び出すシステムコードを呼び出す場合(非常に一般的なパターンですが、コールスタックは明らかに非常に深くなります)。
もしも your-code-2
例外が通過するという例外をスローします system-code
動作が未定義であることを意味します。 system-code
申請書を未定義で、潜在的にクラッシュしている、またはデータが失われた状態に残している場合とそうでない場合があります。
または、もっと強く:例外をスローすることはできません your-code-2
あなたがそれをキャッチして処理できることを期待して your-code-1
.
他のヒント
使い例外処理のために私はかなり集中 オーディオアプリ りなる群から選ばれた少なくともあります。しかしながら読書やビットのベンチマーキング-分解の解析、また問題とはありませんしない理由にしていくことにしましたー)は、たっぷりのしない理由(NSErrorポインタをポイント、エンドレス条件分岐に言え...!).のほとんどの人に言っていることにフォーラムは繰り返しのリンゴDocsに入ります。
いくといった詳細 このブログ ん概要私の知見はこちら
神話1:@み/@catch/@ってあまりにも高い(CPU)
自分のiPhone4,寺1百万円の例外を歩約8.5秒です。この約化による競争力の強化に取り組み8.5マイクロ秒単位です。高価なにリアルタイムCoreAudioスレッドかどうかもう少となりますので、御了承くださいい例外をスローがあります??), が8.5µsのUIAlert語のユーザーの問題がありましたオファイルにネコのiphoneホーム画面用の壁紙ですが?
神話2:@tryブロックしてコスト32bit iOS
リンゴのdocs語の"ゼロコスト@tryブロック 64bit"やる状態での32ビット受付確認メールを返信さい。少しベンチマーキング-分解の分析ようがあることを示すゼロコスト@tryブロック32bit iOS(ARMプロセッサに設置されています。たAppleう言32bit インテル?
神話3:する事項がスローされる例外を通じてココアの枠組みは定義されていません
になっているので"未定義"で答えてくれた方ありがとうござい投げを通じて、アップルの枠組み。 もちろん Appleな取り扱っていきます。 全ての実施例外処理のための回収可能なエラー処理するのかということの現地でいうわけではありません-シングルライン"ます。
一端場合はこちらではの方法で NSObject:performSelectorOnMainThread:waitUntilDone:
.場合は以降のパラメータがあり、このような役割を同期機能する場合が凝らの例外でバブルをお呼び出します。例えば:
/////////////////////////////////////////////////////////////////////////
#pragma mark - l5CCThread
/////////////////////////////////////////////////////////////////////////
@interface l5CCThread : NSThread @end
@implementation l5CCThread
- (void)main
{
@try {
[self performSelectorOnMainThread:@selector(_throwsAnException) withObject:nil waitUntilDone:YES];
} @catch (NSException *e) {
NSLog(@"Exception caught!");
}
}
- (void)_throwsAnException { @throw [NSException exceptionWithName:@"Exception" reason:@"" userInfo:nil]; }
@end
/////////////////////////////////////////////////////////////////////////
#pragma mark - l5CCAppDelegate
/////////////////////////////////////////////////////////////////////////
@implementation l5CCAppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
l5CCThread *thd = [[l5CCThread alloc] init];
[thd start];
return YES;
}
// ...
この場合、例外がパス"を通じ、ココア"の枠組みのメインスレッドの実行ループ)を忘ッチ.簡単に工作することができ周辺のこの利用GCDの dispatch_synch
をこのブロックの引数、メソッドの呼び出しでプラスの例外です。
を利用する理由NSExceptionのNSErrorの
人の仕事のC型フレームワークからのコオーディオ何の音声を瞬時に聞でチェック、取り扱いおよび報告ます。最大の眼目なので@み/@ッNSExceptions提供するコードクリーンです。
と言います5行のコードで動作するファイルです。各も投げつは、たとえば、3つの異なるエラー("例のディスクスペース、読み取りエラーなど)。の代わりに包装ラインごとに条件をチェックできない戻り値を外部に委託するNSErrorポインター調査をもObjCのメソッドまたは悪用 #define
マクロ!), ラップす5行 単一の @み応える"トータルコンサルティンエラーになりました。思い通りのラインだけです。
をNSExceptionサブクラスを使用しており、centraliseエラーメッセージを避けるためにコードが散乱します。できるものとの区別が容易にアプリの"死"から例外がスローされる場合致命的なプログラマの誤りなどNSAssert).できるものは、"氏名"を定のサブクラスの名前は、"name").
例のすべてのことについて詳し、ベンチマークと分解して このブログ...
例外がスをtry/catch/最後には、パラダイムの使用により毎年、建国記念の他の主要言語(C++,Java,PHP,Ruby,Python).もその時の妄想を取り入れて頂けるかも---少なくともます。
一般的に自分自身に尋ねましようとしているこの信号に誤りがあるとき、又はいって例外的な状況か。る方の場合は、それは非常に悪いことにかかわらず、パフォーマンスの問題、あるいは周囲から見た.場合には後者であとは自分がすべきことなのだといいます。