构造一个士兵代理教官的开火的方法,并返回一个对话,教官有相应的对话,然后让士兵去执行。
main
#import <Foundation/Foundation.h>
#import "Master.h"
#import "Solider.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Master *master = [[[Master alloc] init] autorelease];
Solider *solider =[[[Solider alloc] init] autorelease];
NSLog(@"%p",solider);
master.delegate =solider;//必须若引用,不然释放时候会出现问题
[master order];
//保证main函数不退出
while (1) {
[[NSRunLoop currentRunLoop] run];
}
}
return 0;
}
FireProtocol.h协议
- (void) fire;
- (NSInteger) fireOne:(NSInteger) index;
被代理master.h
#import "FireProtocol.h"
@interface Master : NSObject
{
id <FireProtocol>_delegate;
}
@property (nonatomic,assign) id<FireProtocol> delegate;
-(void)order;
master.m
{
NSArray *arr;
NSInteger count;
}
@synthesize delegate = _delegate;
- (id)init
{
self = [super init];
if (self) {
arr =[[NSArray alloc]initWithObjects:@"111",@"222",@"333", nil];
count = 0;
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(order) userInfo:nil repeats:YES];
}
return self;
}
-(void)order
{
//delegate已经指向了士兵了
NSLog(@"del %@",[_delegate class]);
if (_delegate &&[_delegate respondsToSelector:@selector(fire)]) {
//用一个对象的指针引用了另一个对象的空间
[_delegate fire];
// NSInteger temp = [_delegate fireOne:0];
// while (1) {
// switch (temp) {
// case 0:
// NSLog(@"赶紧上!");
// temp = [_delegate fireOne:1];
// break;
// case 1:
// NSLog(@"你们这群废物tm给我上!");
// temp = [_delegate fireOne:2];
// break;
// default:
// break;
// }
// if(temp == 3) break;
// }
//调用代理方法另一种形式
//不带参
//[_delegate performSelector:@selector(fireOne:)];
//带参
// [_delegate performSelector:<#(SEL)#> withObject:<#(id)#>];
if (count <arr.count) {
NSLog(@"%@:%@",[self class],arr[count]);
count = [_delegate fireOne:count];
}
}
}
代理Solider.h
#import <Foundation/Foundation.h>
#import "FireProtocol.h"
@interface Solider : NSObject<FireProtocol>
@end
solider.m
{
NSArray *arr;
}
- (id)init
{
self = [super init];
if (self) {
arr = [[NSArray alloc] initWithObjects:@"队长 AOE太猛了",@"队长死了 赶紧跑",@"还好哥没死", nil];
}
return self;
}
#pragma mark - FireProtocal
-(void)fire
{
NSLog(@"gogogo");
}
-(NSInteger)fireOne:(NSInteger)index
{
// switch (index) {
// case 0:
// NSLog(@"长官 我还没有准备好!");
// return index;
// break;
// case 1:
// NSLog(@"长官 再等等!");
// return index;
// break;
// case 2:
// NSLog(@"长官 您先上!");
// return index;
// break;
// default:
// return 3;
// break;
// }
NSLog(@"%@:%@",[self class],arr[index]);
return ++index;
}