【问题标题】:How to restrict the class to access the methods of specified protocols in Objective-C?如何限制类访问Objective-C中指定协议的方法?
【发布时间】:2010-02-15 09:34:47
【问题描述】:

当我试图在 protocolB 的对象上调用 protocolA 方法时,我会收到编译器警告”,但是我如何将它限制为仅 protocolB 的方法,我的意思是它不应该允许我运行代码,它必须给我一个错误???在Objective-C中有什么方法可以解决这个问题?

例子:

// this is protocolA.h

@protocol protocolA
-(void)methodA;
@end

//this is protocolB.h
#import "protocolA"
@protocol protocolB <protocolA>
-(void)methodB;
@end

//this is MyClass.h
#import "protocolA"

@interface MyClass <protocolA>
{}
@end

//this is MyClass.m 
@implementation

-(void)applicationDidFinishLaunching
{
  id<protocolA> objA = [[MyClass alloc]init];
  [objA methodA];//Should work fine
  [objA methodB];//**Sholud give me error, but only warning is prompted but able to access methodB using objA and print its contents**
}
-(void)methodA
{
NSLog(@"This is in protocolA");
}

-(void)methodB
{
NSLog(@"This is in protocolB");
}

@end

注意:这里我在protocolB中扩展protocolA,但是当我在MyClass中创建protocolA的对象时,我应该只能访问protocolA的methodA而不是protocolB的methodB。

【问题讨论】:

    标签: objective-c protocols


    【解决方案1】:

    编译器警告是您能得到的最远距离。您可以启用“将警告视为错误”标志 (-Werror)。

    它只是一个警告的原因是因为可以在运行时修改类。这意味着任何人都可以插入、删除或更改任何类的方法。然后,以前不存在的调用可能会突然变得有效。编译器无法检查代码是否故意滥用此运行时功能,因此最好发出警告。更何况这只是协议的人为限制。

    【讨论】:

    • @Kenny,那么我将如何将协议限制为仅使用它自己的方法?
    • @suse:你能举个例子吗?
    • @suse:还是和我说的一样。协议 B 采用协议 A 不是关键。即使您调用[objA blahBlahBlah];,它仍然是一个警告,因为-blahBlahBlah 可能存在于运行时。如果您需要错误,请使用-Werror。
    【解决方案2】:

    行:

    id<protocolA> objA;
    

    告诉objA 符合&lt;protocolA&gt;。它不知道objA 是否符合&lt;protocolB&gt;。

    因此编译器不知道向objA 发送methodB 消息是否错误。实际上,在这种情况下,这不是错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多