【问题标题】:How to access a method by inheritance of @protocols in Objective-C?如何通过继承Objective-C中的@protocols来访问方法?
【发布时间】:2010-02-19 09:10:39
【问题描述】:

我有一个协议继承的程序说:

@protocol A
-(void)methodA
@end

继承的协议:

@protocol B<A>
-(void)methodB
@end

实现@protocolA方法的类是

@interface classB<B>

@end

@implementation classB
-(void)methodA
{
  //somecode
}
@end

现在我希望从其他类调用 methodA:

    @implementation SomeotherClass

{
   //call of methodA
   //????

id<A>obj=[[classB alloc]init];//i have tried it
[obj methodA];// even this is not working 
}

怎么做?

【问题讨论】:

    标签: objective-c inheritance protocols


    【解决方案1】:

    像往常一样发送消息:

    SomeotherClass *obj = [[[SomeotherClass alloc] init] autorelease];
    [obj methodA];
    

    由于 classB 的实例实现了协议 B,它们也声称响应 -methodA。 以下编译并运行没有任何问题:

    MyClass.h:

    #import <Foundation/Foundation.h>
    
    @protocol A
    -(void) methodA;
    @end
    
    @protocol B <A>
    -(void) methodB;
    @end
    
    @interface MyClass : NSObject <B>
    {
    }
    
    @end
    

    MyClass.m:

    #import "MyClass.h"
    
    @implementation MyClass
    
    -(void) methodA
    {
        NSLog(@"%s", __PRETTY_FUNCTION__);
    }
    
    -(void) methodB
    {
        NSLog(@"%s", __PRETTY_FUNCTION__);
    }
    
    @end
    

    代码:

    MyClass *obj = [[MyClass alloc] init];
    [obj methodA];
    [obj methodB];
    [obj release];
    

    【讨论】:

    • 我试过了,还是不行。即使我通过protocolA的对象调用该方法,我也无法访问它。我在最后一部分编辑了我的问题。请建议我如何解决这个问题....
    • 到底发生了什么?编译器抱怨、链接器失败或程序崩溃?
    • 感谢您的回答,在代码结束时,我想访问另一个类中的方法,而不是在我实现该方法的 MyClass 中。我希望在我不实现的类中调用该方法那个方法以及协议/没有扩展的地方。怎么做?
    【解决方案2】:

    你没有说如何它无法工作。我猜是因为您没有在您的classB 中实现methodB,所以存在编译错误。

    另一种可能性:在SomeOtherClass 中初始化classB 后会发生什么?你确定你得到了一个有效的对象吗?如果它返回了 nil,则当您向其发送 methodA 消息时,运行时将完全在其权限范围内不做任何事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 2021-10-16
      • 1970-01-01
      • 2012-03-06
      • 2023-04-01
      相关资源
      最近更新 更多