1

Beginning iPhone 4の本では、作成者はこのコードを使用して、アルファベットの各文字の名前のNSArrayを持つNSDictionaryのディープコピーを作成するためのカテゴリを作成し、検索バー付きのインデックス付きテーブルの例を示しています。

#import "NSDictionary-MutableDeepCopy.h"
@implementation NSDictionary (MutableDeepCopy)
- (NSMutableDictionary *) mutableDeepCopy { 
    NSMutableDictionary *returnDict = [[NSMutableDictionary alloc] initWithCapacity:[self count]]; 
    NSArray *keys = [self allKeys]; 
    for (id key in keys) {
        id oneValue = [self valueForKey:key]; 
        id oneCopy = nil;
        if ([oneValue respondsToSelector:@selector(mutableDeepCopy)]) oneCopy = [oneValue mutableDeepCopy];
        else if ([oneValue respondsToSelector:@selector(mutableCopy)]) oneCopy = [oneValue mutableCopy];
        if (oneCopy == nil) 
           oneCopy = [oneValue copy];
        [returnDict setValue:oneCopy forKey:key]; 
        [oneCopy release];
    } 
    return returnDict;
} 

@end

誰かがforループロジックを説明できますか?どの値がどのセレクターに応答するか、そしてなぜそれが辞書に追加されるのかを確認するために彼が何をしようとしているのかわかりません。ありがとう。

4

2 に答える 2

3

したがって、forループは、辞書内のすべてのキーを単純に繰り返し処理します。事前に、という新しい辞書を作成しますreturnDict。これが返されるものになります。

コピーしたい辞書のキーごとに、...

  1. そのキー()用に保存されているオブジェクトを取得し、[self valueForKey:key]それを。という変数に保存しますoneValue

  2. oneValueメソッドを実装する場合mutableDeepCopy(つまり、それはNSDictionary)、それを呼び出して、戻り値をと呼ばれる変数に割り当てますoneCopy

  3. それ以外の場合は、メソッドをoneCopy実装するかどうかを確認します。mutableCopy含まれている場合は、出力をoneCopy変数に入れます。

  4. この時点で、次の手順(2)および(3)で、oneCopy変数に何かが割り当てられているかどうかを確認します(if (oneCopy == nil))。そうでない場合(つまり、に等しい場合)、オブジェクトはまたはのいずれもnil実装していないと見なすことができるため、代わりにプレーンオールドを呼び出してその値をに割り当てます。mutableDeepCopymutableCopycopyoneCopy

  5. 元のキーを使用して辞書に追加oneCopyします。returnDict

これがforループです。最後に、コピーした辞書を返します。

于 2011-05-29T18:31:17.640 に答える
0

forループのロジックは複雑です。これは、作成者が配列全体の可能な限り可変で深いコピーを取得しようとしているためです。コードは、これを満たすために、優先順に3つの異なる方法を試します。

  • mutableDeepCopy可能であれば使用します(オブジェクトがそのメッセージを理解している場合)。
  • それ以外の場合は、mutableCopy可能であれば使用してください。
  • 他のすべてが失敗した場合は、を使用してcopyください。

オブジェクトが単純にコピーできない場合は、オブジェクトがに-copy応答するかどうかのテストが行​​われないため、オブジェクトを送信するときにコードがブームになります-copy。コピーできないアイテムを含む配列をディープコピーしようとすると、間違いなくプログラマーのエラーになるため、これは適切です。

于 2011-05-29T20:18:29.323 に答える