3

多くの古いコードをリファクタリングして、JSON 応答に無効な値が含まれる場合は常に、クライアントが悪いサーバー応答とログ例外に対してより堅牢になるようにします。また、respondsToSelector を使用して解析される各ノードの有効性 (データ型) をチェックすることを考えています。

応答のデータ型 (int、bool など) をチェックしています

[[json objectForKey: @"feature_enabled"] boolValue], 

@"feature_enabled" ノードに 0 または 1 以外のものが含まれている場合、アプリがクラッシュします。

この問題を回避するには、次のようにします

if ([[json objectForKey: @"feature_enabled"] respondsToSelector: @selector(boolValue)]){
          BOOL featureEnabled = [[json objectForKey: @"feature_enabled"] boolValue];
}else{
          Log Exception
}

このコードでパフォーマンス分析を行ったことはありませんが、解析する予定のすべての JSON 応答に対してセレクターへの応答をチェックする場合、パフォーマンスの低下が予想される場合に、どのような種類のパフォーマンスが低下するかを誰かが提案できるかどうかを知りたいです。 .

情報源へのポインタは大歓迎です!

4

2 に答える 2

9

respondsToSelector:nil をチェックします。nill ではなく、IMP キャッシュからメソッドを返すIMP lookUpMethod(Class cls, SEL sel, BOOL initialize, BOOL cache, id inst)を呼び出します ( CacheLookupマクロを使用)。見つからない場合は、クラス自体のメソッドを検索してキャッシュを埋めようとします。これには、スーパークラスでの操作の繰り返しが含まれます。それが失敗すると、転送メカニズムが実行されます。

isKindOfClass:両方のクラスの isa ポインターを比較します。それが失敗した場合は、構造体 objc_classのフィールド 'super_class' だけであるスーパークラスで繰り返されます。

したがって、2 つのオブジェクトを区別する適切な方法は ですisKindOfClass:

JSON データの処理は、上記のすべてよりも何億倍も遅くなることに注意してください。セレクターが見つからなくても、システムが停止することはありません。

于 2012-08-25T01:34:13.213 に答える
5

最高のパフォーマンスであると私が信じている isKindOfClass の使用を検討することをお勧めします。

if([[yourDictionary objectForKey:@"yourKey"] isKindOfClass:[NSArray class]]) { //配列と仮定して処理します }

于 2012-08-24T23:05:42.727 に答える