1

クラス NSUniqueIdentifierのリファレンス ドキュメントでは、一意の ID 指定子が次のスキームで評価されると主張しています。

  1. コンテナーが、valueIn<Key>WithUniqueID:スクリプトのキー値コーディングによって確立された関連パターンと一致するセレクターを持つメソッドを実装する場合、そのメソッドが呼び出されます。この方法は非常に高速である可能性があり、比較的簡単に実装できます。

  2. スクリプト オブジェクト指定子を評価する場合と同様に、指定されたオブジェクトのコンテナーには、オブジェクト指定子を評価する機会が与えられます。コンテナー クラスがメソッドを実装する場合 indicesOfObjectsByEvaluatingObjectSpecifier:、メソッドが呼び出されます。この方法は非常に高速になる可能性がありますが、実装は比較的困難です。

  3. 関連する 'ID' 属性が ID と一致する最初のNSWhoseSpecifierオブジェクトを指定するオブジェクトが合成され、評価されます。オブジェクトは、コンテナ内のNSWhoseSpecifierすべてのキー付き要素を検索して、一致を探す必要があります。検索は非常に遅くなる可能性があります。

ただし、valueIn<Key>WithUniqueID:呼び出されることはありません。例を挙げると、オブジェクト指定子を次のように記述するクラスがあります。

- (NSScriptObjectSpecifier *)objectSpecifier
{
    assert(self.documentID);
    assert(self.controller);
    NSScriptObjectSpecifier *containerRef = self.controller.objectSpecifier;
    assert(containerRef);
    assert(containerRef.keyClassDescription);

    return [[NSUniqueIDSpecifier alloc] initWithContainerClassDescription:containerRef.keyClassDescription
                                                   containerSpecifier:containerRef
                                                                  key:@"allObjects"
                                                             uniqueID:self.documentID];
}

コンテナー クラスで定義した- (id)valueInAllObjectsWithUniqueID:(NSString *)uniqueIDメソッドは、私が定義したメソッドです。

- (id)valueInAllObjectsWithUniqueID:(NSString *)uniqueID {
    return [self objectWithIdentifier:uniqueID];
}

コンテナに対応するクラスでは、-respondsToSelector:これをさらにデバッグするためにオーバーライドし、上記の呼び出しのindicesOfObjectsByEvaluatingObjectSpecifier:直後にスクリプト システムがクエリを実行する唯一の関連メソッドがある-objectSpecifierことを確認します (コンテナ クラスの説明と nil 以外の結果を返すことが確認されました)オブジェクト指定子が評価された直後にメソッド呼び出しを受け取るコンテナーのクラスと一致するコンテナー指定子)。

何か案は?これは OSX Mavericks (10.9.4) にあります。

4

0 に答える 0