【问题标题】:Checking whether an object conforms to two separate protocols in Objective-C在 Objective-C 中检查一个对象是否符合两个独立的协议
【发布时间】:2011-01-10 11:44:47
【问题描述】:

在 Objective-C 中,当你声明一个实例变量时,你可以在编译时检查它是否符合分配协议,如下所示:

id <MyProtocol> variable;

是否可以在编译时检查分配给变量的对象是否符合两个单独的协议?如:

id <MyProtocol, MyOtherProtocol> variable;

我知道我可以使用 conformsToProtocol:respondsToSelector 等进行运行时检查(我在实际使用对象之前会这样做以增加安全性),并且我可以编写自己的 setter 方法来进行检查,但我'想在编译时知道。

【问题讨论】:

  • Doesn't 'id 变量;'工作?至少它编译没有问题......
  • 我目前不在可以检查的计算机旁,但我想知道我正在与同事讨论。

标签: objective-c cocoa cocoa-touch protocols compile-time


【解决方案1】:

是的,语法是正确的。

检查对象是否符合协议的正确方法是这样做:

if ([myObj conformsToProtocol:@protocol(MyProtocol)]) {
  //conformance!
}

请注意,这既可以用作实例方法,也可以用作类方法。

如果由于某些奇怪的原因您不能使用conformsToProtocol:,您可以下拉到运行时级别:

#import <objc/runtime.h>

Protocol * p = objc_getProtocol("MyProtocol");
if (class_conformsToProtocol([myObj class], p)) {
  //conformance!
}

【讨论】:

    【解决方案2】:

    我认为最好是使用你自己的代码:

    id <MyProtocol, MyOtherProtocol> variable;
    

    在调用方法之前,请检查变量是否响应您要调用的内容:

    if ([variable respondsToSelector:@selector(aMethod:)]) {
        [variable aMethod:nil];
    }
    

    由于 Objective-C 是一种动态语言,仅仅声明变量协议并不能保证它符合协议。它主要会在您构建时生成警告。

    【讨论】:

    • 谢谢,我只需要知道 语法有效且有效。
    【解决方案3】:

    您不能总是在编译时检查协议一致性,因为从编译器的角度来看,(非限定)类型 id 的对象始终是有效对象。例如,

    id<P1> p1;
    id<P2> p2;
    id p0;
    
    // compiler warning: assigning to 'id<P1>' from incompatible type 'id<P2>'
    p1 = p2;
    
    // no compiler warning
    p0 = p2;
    p1 = p0;
    

    话虽如此,&lt;P1, P2&gt; 会在对象不符合编译时已知的两种协议if 的情况下向您发出警告:

    id<P1> p1;
    id<P2> p2;
    id<P1, P2> p12;
    id<P1, P2> q12;
    id p0;
    
    p12 = p1; // warning: assigning to 'id<P1,P2>' from incompatible type 'id<P1>'
    p12 = p2; // warning: assigning to 'id<P1,P2>' from incompatible type 'id<P2>'
    p12 = q12; // no compiler warning
    
    // no compiler warning
    p0 = p1;
    p12 = p0;
    

    【讨论】:

      猜你喜欢
      • 2016-10-04
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多