1、使用場合app
2、使用步驟atom
3、不使用protocol實現代理spa
首先不使用protocol來實現,這樣就能夠更好的對比:代理到底有什麼好的。代理
項目中使用到的類code
咱們如今想讓護士來照看孩子,若是孩子出現哭、吃、睡等行爲時,護士立馬相應,而且作出相應的動做對象
Baby.hblog
// // Baby.h // 01-代理模式 // // Created by apple on 14-4-2. // Copyright (c) 2014年 apple. All rights reserved. // #import <Cocoa/Cocoa.h> @class Nurse; @interface Baby : NSObject @property (nonatomic, assign) int age; @property (nonatomic, retain) Nurse *nurse; -(void)cry; -(void)eat; -(void)sleep; @end
Baby.mit
// // Baby.m // 01-代理模式 // // Created by apple on 14-4-2. // Copyright (c) 2014年 apple. All rights reserved. // #import "Baby.h" #import "Nurse.h" @implementation Baby -(void)cry { NSLog(@"%d is crying", _age); [_nurse cry:self]; } -(void)eat { NSLog(@"%d is hugry", _age); [_nurse eat:self]; } -(void)sleep { NSLog(@"%d is sleep", _age); [_nurse sleep:self]; } @end
Nurse.hio
// // Nurse.h // 01-代理模式 // // Created by apple on 14-4-2. // Copyright (c) 2014年 apple. All rights reserved. // #import <Foundation/Foundation.h> @class Baby; @interface Nurse : NSObject -(void)cry:(Baby*) bady; -(void)eat:(Baby*) bady; -(void)sleep:(Baby*) bady; @end
Nurse.mclass
// // Nurse.m // 01-代理模式 // // Created by apple on 14-4-2. // Copyright (c) 2014年 apple. All rights reserved. // #import "Nurse.h" @implementation Nurse -(void)cry { NSLog(@"哄孩子"); } -(void)eat { NSLog(@"喂孩子"); } -(void)sleep { NSLog(@"讓孩子睡覺"); } @end
main.m
// // main.m // 01-代理模式2 // // Created by apple on 14-4-2. // Copyright (c) 2014年 apple. All rights reserved. // #import <Foundation/Foundation.h> #import "Baby.h" #import "Nurse.h" int main(int argc, const char * argv[]) { @autoreleasepool { Nurse *nurse = [[Nurse alloc] init]; Baby *baby = [[Baby alloc] init]; baby.nurse = nurse; [baby cry]; } return 0; }
彷佛這樣的實現,並無什麼問題,可是若是有一天,護士忽然不照護孩子了,咱們將孩子交給一個老師來照料,是否是不少內容還改?
甚至有一天老師也不照料了,咱們給孩子的爺爺奶奶來照料,又須要改不少內容
因此,咱們可使用protocol來實現
4、使用protocol實現代理
1⃣️咱們先定義一份協議
// // LookBaby.h // 01-代理模式3 // // Created by apple on 14-4-2. // Copyright (c) 2014年 apple. All rights reserved. // #import <Foundation/Foundation.h> @class Baby; @protocol LookBaby <NSObject> -(void)cry:(Baby*) baby; -(void)eat:(Baby*) baby; -(void)sleep:(Baby*) baby; @end
2⃣️Nurse遵循協議,且實現協議中的方法
.h
// // Nurse.h // 01-代理模式 // // Created by apple on 14-4-2. // Copyright (c) 2014年 apple. All rights reserved. // #import <Foundation/Foundation.h> #import "LookBaby.h" @class Baby; @interface Nurse : NSObject <LookBaby> @end
.m
// // Nurse.m // 01-代理模式 // // Created by apple on 14-4-2. // Copyright (c) 2014年 apple. All rights reserved. // #import "Nurse.h" @implementation Nurse -(void)cry:(Baby*)baby { NSLog(@"哄孩子"); } -(void)eat:(Baby*)baby { NSLog(@"喂孩子"); } -(void)sleep:(Baby *)baby { NSLog(@"哄孩子睡覺"); } @end
3⃣️Baby定義一個實現協議的屬性
.h
// // Baby.h // 01-代理模式 // // Created by apple on 14-4-2. // Copyright (c) 2014年 apple. All rights reserved. // #import <Cocoa/Cocoa.h> #import "LookBaby.h" @class Nurse; @interface Baby : NSObject @property (nonatomic, assign) int age; @property (nonatomic, retain) id <LookBaby> loolBaby; -(void)cry; -(void)eat; -(void)sleep; @end
.m
// // Baby.m // 01-代理模式 // // Created by apple on 14-4-2. // Copyright (c) 2014年 apple. All rights reserved. // #import "Baby.h" #import "Nurse.h" @implementation Baby -(void)cry { NSLog(@"%d is crying", _age); [_loolBaby cry:self]; } -(void)eat { NSLog(@"%d is hugry", _age); [_loolBaby eat:self]; } -(void)sleep { NSLog(@"%d is sleep", _age); [_loolBaby sleep:self]; } @end
4⃣️建立B對象,設置A的delegate屬性爲B對象
// // main.m // 01-代理模式3 // // Created by apple on 14-4-2. // Copyright (c) 2014年 apple. All rights reserved. // #import <Foundation/Foundation.h> #import "Baby.h" #import "Nurse.h" int main(int argc, const char * argv[]) { @autoreleasepool { Nurse *nurse = [[Nurse alloc] init]; Baby *baby = [[Baby alloc] init]; baby.loolBaby = nurse; baby.age = 10; [baby eat]; } return 0; }