#import <Foundation/Foundation.h>

 

@protocol Study <NSObject>

//协议只是一堆方法的声明,也就是说协议只有头文件.h,没有.m文件 实现文件,谁遵守协议,谁就要实现协议里地方法.

//协议里面的方法,有俩个大类:@required @optional

//@required修饰的方法是必须实现的,@optional修饰的方法是可选实现.

//协议通常与代理一起实现!!

// 默认就是@required

MarryProtocol.h

@protocol MarryProtocol <NSObject>

 

@required

- (void)makeMoney;

- (void)cook;

- (void)washClothes;

- (void)doHoushWork;

 

@optional

- (void)takeCareBaby;

//  Girl.h

 

//实例对象(代理对象)必须是一个接受了结婚协议的对象

//想要成为丈夫,就必须接受这个协议.

//

@interface Girl : NSObject

{

    NSString *_name;

    id<MarryProtocol> _delegate; //代理对象 接受结婚协议的对象

 

}

- (void)setName:(NSString *)name;

- (NSString *)name;

 

- (void)setDelegate:(id<MarryProtocol>)delegate;

- (id<MarryProtocol>)delegate;

 

- (instancetype)initWithName:(NSString *)name;

+ (instancetype)girlWithName:(NSString *)name;

 

 

- (void)work;

 

 

- (void)clothDirty;//衣服脏了

 

- (void)hungry;//饿了

 

- (void)houseDirty;//屋子脏了

 

- (void)shopping;//购物

 

@end

//  Girl.m

@implementation Girl

- (void)setName:(NSString *)name

{

    _name = name;

}

- (NSString *)name

{

    return _name;

}

- (void)setDelegate:(id<MarryProtocol>)delegate

{

    _delegate = delegate;

}

 

- (id<MarryProtocol>)delegate

{

    return _delegate;

}

 

- (instancetype)initWithName:(NSString *)name

{

    self = [super init];

    if(self)

    {

        [self setName:name];

      //  [self setDelegate:delegate];

    }

    return self;

}

+ (instancetype)girlWithName:(NSString *)name

{

    return [[Girl alloc] initWithName:name];

}

 

 

- (void)work

{

    NSLog(@"每天都是写代码");

}

 

- (void)clothDirty  //衣服脏了

{

    [_delegate washClothes];

}

 

- (void)hungry//饿了

{

    [_delegate cook];

}

 

- (void)houseDirty//屋子脏了

{

    [_delegate doHoushWork];

}

 

- (void)shopping//购物

{

    [_delegate makeMoney];

}

 

@end

//  Boy.h

#import "MarryProtocol.h"

@interface Boy : NSObject <MarryProtocol>

{

    NSString *_name;

 

}

 

- (void)setName:(NSString *)name;

- (NSString *)name;

 

- (instancetype)initWintName:(NSString *)name;

- (void)work;

 

- (void)makeMoney;

- (void)cook;

- (void)washClothes;

- (void)doHoushWork;

 

@end

Boy.m

 

@implementation Boy

- (void)work

{

    NSLog(@"分析程序结构,设计程序架构");

}

 

- (void)clothDirty//衣服脏了

{

    NSLog(@"洗衣服");

}

 

 

- (void)makeMoney

{

    NSLog(@"辛勤工作,上交工资");

}

 

- (void)doHoushWork//屋子脏了

{

    NSLog(@"做牛做马,");

}

 

- (void)cook

{

    NSLog(@"做饭");

}

 

- (void)washClothes

{

    NSLog(@"洗衣服");

}

 

@end

mian.m

   Girl *girl = [Girl girlWithName:@"林志玲"];

  Boy *boy = [[Boy alloc] initWintName:@"屌丝"];

    [girl setDelegate:boy];

    [girl hungry];

    [girl clothDirty];

    [girl houseDirty];

    [girl shopping];

 

 

 

 

 

 

- (void)test3;

 

// @required表示必须实现的方法

// 虽然字面上说是必须实现,但是编译器并不强求某个类进行实现

@required

- (void)test;

 

- (void)test1;

 

// @optional表示可选(可实现\也可不实现)

@optional

- (void)test2;

@end

 

 

main.m文件

#import <Foundation/Foundation.h>

#import "Student.h"

 

@protocol Study;

 

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

{

 

    @autoreleasepool {

        Student *stu = [[[Student alloc] init] autorelease];

        

        // OC是弱语法的,对类型要求不严格

        // NSString *stu = [[[Student alloc] init] autorelease];

        // [stu stringByAbbreviatingWithTildeInPath];

        

        // conformsToProtocol:判断是否遵守了某个协议

        if ([stu conformsToProtocol:@protocol(Study)]) {

            NSLog(@"Student遵守了Study这个协议");

        }

        

        // respondsToSelector:判断是否实现了某个方法

        if ( ![stu respondsToSelector:@selector(test)] ) {

            NSLog(@"Student没有实现test这个方法");

        }

    }

    return 0;

}

 posted on 2015-04-14 20:58  ianhao_cn  阅读(174)  评论(0编辑  收藏  举报