视频: 安装ios苹果手机抓包神器以及解决设备共存限制 2024
协议定义了可以由任何类实现的一组方法。将协议看作定义类必须实现的接口。协议通常用于指定委托对象的接口。
使用协议特性,可以避免强制子类化以创建多态类。 Objective-C(与C ++不同)不允许类有多个超类。因此协议是Objective-C中的一个重要特性,因为它不允许多重继承。
<!当一个类实现协议中的方法时,该类被称为符合 协议。 协议的定义与类的接口的定义类似。但是,协议没有父类或实例变量。下面是一个来自后缀计算器程序的协议定义(可打印)的例子:
@protocol Printable - (void)printMe; //我可以省略@required,因为它是默认的@optional - (NSString *)printMeToString; -d
随着Objective-C 2.0的到来(甚至非常激动人心),协议方法可以是必需的(默认的)或可选的。
<!这里是StackOfInteger的声明,声明它将实现协议:@interface StackOfInteger:NSObject … -d
以下是StackOfInteger类中协议的实现:@implementation StackOfInteger;其他的StackOfInteger方法… ///////////实现Printable协议的方法//////////// - (void)printMe {int k,stackCount = [elements count]; NSLog(@“Stack-> Last>%dlast); for(k = 0; k%@
注意printMeToString方法没有实现,因为它是可选的
<! - 3 - > <一个程序可以测试一个对象是否符合一个协议,下面的代码包含了这个测试的例子(取自该示例的主程序):printf(“Testing conformance to如果([myStack conformsToProtocol:@protocol(Printable)]){printf(“Using protocol methodsn”); [myStack printMe];} else {NSLog(@“Object not conform to protocol%@ n”, @protocol(Printable));} id someObject = [[PostfixCalculator alloc] initWithExpression:@“44 55 *”]; if(![someObject conformsToProtocol:@protocol(Printable)]){NSLog(@“Object does not conform to因为myStack对象符合协议,所以它的printMe和printMeToString方法被调用,因为someObject(这是类型id使得这个例子更有意义)不符合Printable协议,所以测试符合性失败。
也可以使用方法respondsToSelector测试是否存在可选的方法。
你可以简单地通过实现该协议定义的方法使一个类采用协议。也就是说,你不必在其接口中声明协议。但是,即使该类实现了协议方法,它也会而不是
符合协议,并且将不能通过前面的一致性测试。