使用:delegate 和datasource
指定具体做某事,
类中定义
@property (nonatomic,weak) id<UISomeObjectDelegate> delegate;
@property (nonatomic,weak) id<UISomeObjectDataSource> dataSource;
这样,你就可以在实现该类的地方(类C)指定delegate,当然类C也是实现该的协议,这样就可以指定: instance.delegate = self;
当某种条件下,delegate会调用其中的一些方法,类C当然重写了这些方法。
用法2.dataSource uiview中,例如uiTable
对它指定特定协议的数据源,uiTable只要调用它的数据源的某些方法去获取数据,因为ui是不拥有数据的,getContentAt:(int)row;
用法3. Animation
person.h
person.m
指定具体做某事,
类中定义
@property (nonatomic,weak) id<UISomeObjectDelegate> delegate;
@property (nonatomic,weak) id<UISomeObjectDataSource> dataSource;
这样,你就可以在实现该类的地方(类C)指定delegate,当然类C也是实现该的协议,这样就可以指定: instance.delegate = self;
当某种条件下,delegate会调用其中的一些方法,类C当然重写了这些方法。
用法2.dataSource uiview中,例如uiTable
对它指定特定协议的数据源,uiTable只要调用它的数据源的某些方法去获取数据,因为ui是不拥有数据的,getContentAt:(int)row;
用法3. Animation
实现某些元件,比如UIView是 animatable,这样就可以对他设置动画了,具体就是调用对应动画的函数
main.m
//
#import <Foundation/Foundation.h>
#import "Person.h"
#import "School.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// 定义协议在运行时与 单个id时没区别多,只是为了在编译时更好而已
// NSString *defaultName = @"wuyr";
// 方式1 obj PersonProtocol协议类型
// id <PersonProtocol> obj = [[Person alloc] init];
// if (![obj getName]) {
// [obj setName:defaultName];
// }
// NSLog(@"name: %@",[obj getName]);
Person *per1 = [[Person alloc] init];
[per1 setName:@"per1"];
Person *per2 = [[Person alloc] init];
[per2 setName: @"per2"];
School *school = [[School alloc] init];
[school addStudent:per1];// 方式2 定义对应协议的参数,其实就是相当于as3或者java里的接口
[school addStudent:per2];
NSLog(@"students: %@", [school getStudentNames]);
}
return 0;
}
person.h
#import <Foundation/Foundation.h>
@protocol PersonProtocol <NSObject>
// 如果你实现了PersonProtocol协议,你必须还要实现<>中的必须实现的方法,可以同时拥有多个父协议
@property (readonly) NSString *name;
-(void) setAge:(int) aAge;
-(void) setName:(NSString *)aName;
-(NSString *)getName;
@optional
-(int) setHeight:(float) height;
@end
//-----------------------------
@interface Person : NSObject <PersonProtocol>
@end
person.m
#import "Person.h"
@implementation Person
@synthesize name;
-(void)setAge:(int)aAge{
}
-(void)setName:(NSString *)aName{
name = aName;
}
-(NSString *)getName{
return name;
}
@end
school.h
#import <Foundation/Foundation.h>
#import "Person.h"
@interface School : NSObject
-(void) addStudent:(id<PersonProtocol>) student;
-(NSMutableArray*)getStudentNames;
@end
school.m
#import "School.h"
@interface School(){
NSMutableArray *students;
}
@end
@implementation School
-(void)addStudent:(id<PersonProtocol>)student{
if (!students) {
students = [NSMutableArray array];
}
[students addObject:student];
}
-(NSMutableArray *)getStudentNames{
NSMutableArray *arr = [NSMutableArray array];
id <PersonProtocol> student;
for (student in students) {
[arr addObject:[student getName]];
}
return arr;
}
@end