当我试图调用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。
答案 0 :(得分:3)
编译器警告是你能得到的最远的。您可以启用“将警告视为错误”标记(-Werror
)。
它只是一个警告的原因是因为可以在运行时修改类。这意味着任何人都可以插入或删除或更改任何类的方法。然后,先前不存在的呼叫可能突然变得有效。编译器无法检查代码是否故意滥用此运行时功能,因此警告是最好的选择。更不用说它只是协议的人为限制。
答案 1 :(得分:0)
该行:
id<protocolA> objA;
告诉objA
符合<protocolA>
。它不会告诉objA
是否符合<protocolB>
。
因此编译器不知道向methodB
发送objA
消息是否错误。实际上,在这种情况下,这不是错误。