如何限制类访问Objective-C中指定协议的方法?

时间:2010-02-15 09:34:47

标签: objective-c protocols

当我试图调用protocolA方法时,在protocolB的一个对象上,我正在收到编译器警告“,但是如何将它限制为仅仅是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。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

该行:

id<protocolA> objA;

告诉objA符合<protocolA>。它不会告诉objA是否符合<protocolB>

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