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上面调用之后(并确认返回带有容器类描述的非零结果和在评估对象说明符后立即与容器的类接收方法调用一致的容器说明符)。

有任何想法吗?这是在 OSX Mavericks (10.9.4) 上。

4

0 回答 0