协议与数据类型。
我们可以在使用的数据类型中为实例变量和方法参数指定协议名称。这样,可以给Objective-c的编译器提供更多的信息,从而有助于检查我们的代码的错误。
id类型表示一个可以指向任何类型的对象的指针,它是一个泛型对象类型。我们可以将任何对象赋值给一个id类型的变量。也可以将一个id类型的变量赋值给任何类型的对象指针。如果一个用尖括号括起来的协议名称跟随在id之后,编译器就会知道我们期望任意类型的对象,只要遵守该协议。
id类型的对象可以加协议限制。
表示该对象必须遵守指定的协议。
例如:id < NSCopying>obj;
委托是一种常用的设计模式。是两个类之间的关系。
在cocoa中的类,经常使用一种名为委托(delegate)的技术,委托是一个类的对象会要求委托对象执行它的某些操作。
委托的操作步骤:
1实现雇主类
2完成委托协议
3实现代理类
4建立委托关系。
例:
雇主类:
#import <Foundation/Foundation.h>
#import "Question.h"
@interface Student :NSObject
{
id<Question> delegate;
}
@property (assign)id <Question> delegate;
-(void)askQuestion;
@end
#import "Student.h"
@implementation Student
@synthesize delegate;
-(void)askQuestion
{
NSLog(@"ask question by student……");
[delegate answerQuestion];//调用teacher中类的方法。
}
@end
委托协议
#import <Foundation/Foundation.h>
@protocol Question <NSObject>
-(void)answerQuestion;
@end
代理类
#import <Foundation/Foundation.h>
#import "Question.h"
@interface Teacher :NSObject <Question>//采用协议
@end
#import "Teacher.h"
@implementation Teacher
-(void)answerQuestion//实现协议中的方法。
{
NSLog(@"answer queston by teacher……");
}
@end
#import <Foundation/Foundation.h>
#import "Student.h"
#import "Teacher.h"
#import "Question.h"
int main(int argc,constchar * argv[])
{
@autoreleasepool {
Teacher *teacher=[Teacher new];
Student *student=[Student new];
student.delegate=teacher;//建立委托关系。
[student askQuestion];
[teacher release];
[student release];
}
return 0;
}