何為協議,何為委托,何為分類(類別)?
委托 即 代理 delegate:
他是 (接口的實現類)類似c中的回調。 把某個對象要做的事情委托給別的對象去做。 那麼別的對象就是這個對象的代理,來代替他處理要做的事情。 在code中,首先你要明確一個對象的委托方是誰,委托的內容是什麼。 在mfc中,每個程序都要繼承自cwinapp,就是要重寫幾個虛函數額。 但是在cocoa中,我們來實現個UIApplicationDelegate代理,不用繼承,我們只需要考慮你要捕獲的應用程序生命周期中的函數就可以了。 可以這樣用指針來看: 類a中有一個類b的指針,那麼b就是a的代理委托。a干完一件事情就需要告訴b,b調用對應的方法來做出相應的響應。 ios開發中: 如:視圖之間傳輸信息。 兩個頁面uiview 來實現傳值,用delegate可以很好地做到。
@interface A: UIView @property(nonatic, retain) id aValueDelegate; @end; @implementation A - (void) fa { NSString *value = @"hello"; [aValueDelegate aValue:value]; } @end; @interface B: UIView NSString *value; @end; @implementation B - (void) aValue:(NSString *)fromValue { value = fromValue; NSLog(@"%@", value); } @end; A *a = [[A alloc] init]; B *b = [[B alloc] init]; a.aValueDelegate = b; //設置a代理委托對象為b
@interface NSString(NumberConvenience) -(NSNumber*) lengthAsNumber; @end
@interface NSObject (***Delegate) //method @end
// // Dog.h // protocol2 // // Created by peter on 14-2-25. // Copyright (c) 2014年 peter. All rights reserved. // #import@interface Dog : NSObject @property int ID; @end @interface NSObject(myCategory) - (void)callFromNSObject; @end // // Dog.m // protocol2 // // Created by peter on 14-2-25. // Copyright (c) 2014年 peter. All rights reserved. // #import "Dog.h" @implementation Dog - (id)init { self = [super init]; return self; } @end @implementation NSObject(myCategory) - (void)callFromNSObject { NSLog(@"iam nsobject"); } @end // // Person.h // protocol2 // // Created by peter on 14-2-25. // Copyright (c) 2014年 peter. All rights reserved. // #import #import "Dog.h" @interface Person : NSObject //{ // Dog *dog; //} @property Dog *dog; - (void)callFun; @end // // Person.m // protocol2 // // Created by peter on 14-2-25. // Copyright (c) 2014年 peter. All rights reserved. // #import "Person.h" @implementation Person @synthesize dog; - (void) callFun { NSLog(@"Call Fun!"); [dog callFromNSObject]; } @end // // main.m // protocol2 // // Created by peter on 14-2-25. // Copyright (c) 2014年 peter. All rights reserved. // #import #import "Dog.h" #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { Dog *dog = [[Dog alloc]init]; [dog setID:10]; Person *qy = [[Person alloc]init]; [qy setDog:dog]; [qy callFun]; } return 0; }
@protocol NSCopying -(id) copyWithZone:(NSZone *) zone; @end @interface Car : NSObject{ // instance variable } // method @end // Car
@protocol myprotocol@optional -(void)print:(int)value; //可選的方法 @required -(int)printValue:(int)value1 andValue:(int)value2; //必須實現的 @end #import #import "myprotocol.h" //實現協議 myprotocol @interface mytest : NSObject - (void)showInfo; @end #import "mytest.h" @implementation mytest -(void)showInfo { NSLog(@"I am in showInfo"); } //實現協議必須實現的 -(int)printValue:(int)value1 andValue:(int)value2 { NSLog(@"print value1 %d,value2 %d",value1,value2); return 0; } //實現可選的 -(void)print:(int)value { NSLog(@"print value is %d",value); } @end #import #import "mytest.h" #import "myprotocol.h" int main (int argc, const char * argv[]) { @autoreleasepool { mytest *test=[[mytest alloc]init]; [test showInfo]; [test printValue:20 andValue:30]; //print協議是可選的,所以在用之前一定要判斷是否實現了,不然可能會出錯,使用下面的方法 // [test print:20]; SEL sel=@selector(print:); if([test respondsToSelector:sel]){ [test print:11]; } //用協議的方式實現 id protocol =[[[mytest alloc]init]autorelease]; [protocol showInfo]; [protocol printValue:200 andValue:300]; if([protocol respondsToSelector:@selector(print:)]){ [protocol print:111]; } } return 0; }
// // Dog.h // catagory // // Created by peter on 14-2-25. // Copyright (c) 2014年 peter. All rights reserved. // #import@protocol dogBark; @interface Dog : NSObject { int barkCount; NSTimer *timer; } @property int ID; @property (assign)id delegate; //dog master @end @protocol dogBark - (void)bark: (Dog*)thisDog count:(int)count; @end // // Dog.m // catagory // // Created by peter on 14-2-25. // Copyright (c) 2014年 peter. All rights reserved. // #import "Dog.h" @implementation Dog //ID use _ID @synthesize delegate; - (id)init { if (self = [super init]) { //create nstimer user, 1.0s use updateTimer:nil timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateTimer:) userInfo:nil repeats:YES]; } return self; } - (void) updateTimer:(id)arg { barkCount++; NSLog(@"dog bar %d", barkCount); //user master delegate bark:count [delegate bark:self count:barkCount]; } @end // // person.h // catagory // // Created by peter on 14-2-25. // Copyright (c) 2014年 peter. All rights reserved. // #import #import "Dog.h" @interface person : NSObject { Dog *_dog; } @property (retain, nonatomic) Dog *dog; @end // // person.m // catagory // // Created by peter on 14-2-25. // Copyright (c) 2014年 peter. All rights reserved. // #import "person.h" @implementation person - (void)setDog:(Dog *)aDog { if (_dog != aDog) { [_dog setDelegate:self]; } } //dog use person interface - (void)bark:(Dog *)thisDog count:(int)count { NSLog(@"person bark: this dog %d bark %d", [thisDog ID], count); } @end // // main.m // catagory // // Created by peter on 14-2-25. // Copyright (c) 2014年 peter. All rights reserved. // #import #import "Dog.h" #import "person.h" int main(int argc, const char * argv[]) { @autoreleasepool { person *qy = [[person alloc]init]; Dog *dog = [[Dog alloc]init]; [dog setID:10]; [qy setDog:dog]; while (1) { [[NSRunLoop currentRunLoop]run]; } } return 0; }