0

私はiPhoneでアプリケーションを作成しています。このアプリケーションは、AndroidとiPhoneの両方で同様に機能する必要があるため、記述されたコードとJavaを使用してObjective-Cに変換しています。もちろん問題は、言語がかなり異なり、適切に実装するのが難しい特定の領域があることです。

もちろん異なる領域の1つは、特定のタイプのオブジェクトのみを受け入れるNSMutableArraysまたはNSMutableDictionariesを作成できないことです。したがって、これらのオブジェクトのゲッターとセッターを作成するときは、次の例でこれを行っています。

  -(void)setPerson:(NSMutableArray *)personList_p
    {
        BOOL bAllowed = YES;
        for(int i = 0; i < [personList_p count]; i++)
        {
            if(![[personList_p objectAtIndex:i] isKindOfClass:[Person class]])
            {
                bAllowed = NO;
                break;
            }
            else
            {
                bAllowed = YES;
            }
        }

        if(bAllowed)
        {
        personList_i = personList_p;
        }
        else
        {
        //Raise error here
        }
    }

以前はNSRaiseExceptionを使用していましたが、それを読んだ後、例外処理はリソースを大量に消費するため、このタイプの状況では使用しないことをお勧めします。だから私が読んだNSErrorは良い解決策だったので、私はこのガイドを読んでいました

http://www.cimgf.com/2008/04/04/cocoa-tutorial-using-nserror-to-great-effect/

私の質問は2つあります。NSErrorを使用することにした場合、メソッドでNSErrorオブジェクトを宣言するのがベストプラクティスです。つまり、次のようになります。

-(void)setPerson:(NSMutableArray *)personList_p : (NSError **)error

または、このように、上記のelseステートメント内でエラーを宣言するだけで大​​丈夫ですか?

 NSError *error = nil;
         NSMutableDictionary* details = [NSMutableDictionary dictionary];
                [details setValue:@"Invalid object passed into Array, object must be of type Person." forKey:NSLocalizedDescriptionKey];
                error = [NSError errorWithDomain:@"Invalid Object" code:200 userInfo:details];
                NSLog(@"%@", [error localizedDescription]);

第二に、私が上でリンクしたガイドで、結論として著者は言います

この例では、メッセージ呼び出し後もエラーがまだゼロであるかどうかを確認しています。nilでなくなった場合は、エラーが発生したことを認識しており、ユーザーに表示する必要があります。Appleは、NSApplicationインスタンスでpresentError:を呼び出すことでこれを行うための組み込みメソッドを提供しています

彼はここでこのコード行を使用します

[NSApp presentError:error];

これは私には機能しません。このコードではオートコンプリートオプションを取得できません。宣言されていない識別子の使用を示しているだけです。ここで明らかな何かが欠けていますか?

また、念のために言っておきますが、私が使用している方法は、ユーザーが正しいオブジェクトタイプの配列を送信することを保証するための最良の方法ですか?または、同じことをより効率的に達成するために使用できる別の方法がありますか。

前もって感謝します!!

編集:

追加の質問ですが、NSErrorの問題はアプリが続行することであるため、NSExceptionを使用するのは非常に悪い考えです。無効なオブジェクトを含む配列を渡した場合、アプリケーションが発生するだけであるため、NSExceptionを使用することを検討しています。クラッシュして例外を発生させます。私がこれをすべきでない主な理由はありますか?

4

1 に答える 1

2

以前はNSRaiseExceptionを使用していましたが、それを読んだ後、例外処理はリソースを大量に消費するため、このタイプの状況では使用しないことをお勧めします。だから私が読んだNSErrorは良い解決策だったので、私はこのガイドを読んでいました

彼は実際には、例外を発生させることは本質的に悪いことやリソースを大量に消費することではなく、@ try/catchは物事を進めるための間違った方法であると主張しています。それと、Cocoaアプリケーション(私はCocoa-Touchです)は、可能な限り例外をスローしないようにする必要があります。例外は、単純なエラーではなく、未定義の動作を示します。

第二に、私が上でリンクしたガイドでは、結論として、著者は...ここでこのコード行を使用しています

[NSApp presentError:error];

これは私には機能しません。このコードではオートコンプリートオプションを取得できません。宣言されていない識別子の使用を示しているだけです。ここで明らかな何かが欠けていますか?

これは、NSAppがCocoa(またはMac)アプリケーションにのみアクセス可能な概念であるためです。これは「アプリケーション自体」へのポインタを表し、それに関連付けられたかなりきちんとした関数がいくつかあります。もちろん、iOSには並列の概念がないため、エラーは従来UIAlertViewに表示されます。

追加の質問ですが、NSErrorの問題はアプリが続行することであるため、NSExceptionを使用するのは非常に悪い考えです。無効なオブジェクトを含む配列を渡した場合、アプリケーションが発生するだけであるため、NSExceptionを使用することを検討しています。クラッシュして例外を発生させます。私がこれをすべきでない主な理由はありますか?

一般に、非常に深刻なロジック以外の目的でNSExceptionを使用することはお勧めできません(たとえば、NSArrayの範囲外のインデックスが呼び出された場合や、UITableViewのデータソースがたまたま同期していない場合などです。テーブルの要求)。プログラムの実行を絶対に停止する必要がある場合は、NSAssert()条件付き例外をスローするために使用する方がはるかにクリーンです。そしてそれでも、セッターは例外を投げる場所ではありません。条件が失敗したときに単にnilを返し、呼び出し元にそのような結果をチェックさせて適切に処理させる方がはるかに簡単です。

于 2012-10-29T22:04:09.540 に答える