oc学习之旅:协议

来源:互联网 发布:河南网络信访平台 编辑:程序博客网 时间:2024/05/29 05:05

构造一个士兵代理教官的开火的方法,并返回一个对话,教官有相应的对话,然后让士兵去执行。

main

#import <Foundation/Foundation.h>

#import "Master.h"

#import "Solider.h"

int main(int argc,const char * argv[])

{


    @autoreleasepool {

        

       Master *master = [[[Masteralloc] init]autorelease];

       Solider *solider =[[[Solideralloc] init]autorelease];

       NSLog(@"%p",solider);

        master.delegate =solider;//必须若引用,不然释放时候会出现问题

        [masterorder];

        

        //保证main函数不退出

       while (1) {

            [[NSRunLoopcurrentRunLoop] 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 = [superinit];

   if (self) {

       arr =[[NSArrayalloc]initWithObjects:@"111",@"222",@"333",nil];

       count = 0;

        [NSTimerscheduledTimerWithTimeInterval:1.0target:selfselector:@selector(order)userInfo:nilrepeats:YES];

    }

    return self;

}

-(void)order

{

    //delegate已经指向了士兵了

   NSLog(@"del %@",[_delegateclass]);

   if (_delegate &&[_delegaterespondsToSelector:@selector(fire)]) {

        //用一个对象的指针引用了另一个对象的空间

        [_delegatefire];

       

//        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(@"%@:%@",[selfclass],arr[count]);

           count = [_delegatefireOne:count];

        }

    }

}


代理Solider.h

#import <Foundation/Foundation.h>

#import "FireProtocol.h"

@interface Solider :NSObject<FireProtocol>


@end


solider.m

{

   NSArray *arr;

}

- (id)init

{

   self = [superinit];

   if (self) {

        arr = [[NSArrayalloc] 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(@"%@:%@",[selfclass],arr[index]);

   return ++index;

}



0 0