#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;
}