国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

動態多態

2019-11-06 07:45:57
字體:
來源:轉載
供稿:網友

多態:相同接口,不同實現 相同接口:方法的簽名、參數、返回值相同 不同實現:具體實現的內容不同

動態多態包括:

動態類型識別動態綁定動態加載

動態類型識別

@interface A:NSObject-(void)draw;@end@interface B:A-(void)draw;@end@interface C:B-(void)draw;@end@interface D:NSObject-(void)paint:(A*)aA;//此處可改為//-(void)paint:(id)aA@end@implementation D-(void)paint:(A*)aA//此處可改為//-(void)paint:(id)aA{[aA draw];}@end@autoreleasepool{D *d = [[D alloc] init];A *a = [[D alloc] init];B *b = [[D alloc] init];C *c = [[D alloc] init];[d paint:a];[d paint:b];[d paint:c];//因為b,c對象都繼承于A類,故在此可以用父類指針調用子類對象

id類型和多態的識別原理

而這里如果改成id指針類型,其不進行類型檢查,可以指向屬于任何類的對象,因為id類型不能說明對象的類型,而是要求對象本身提供這些信息isa實例變量永遠是對象的第一個實例對象, 而id指針相當于class *isa 指針,其中包含了可以儲存對象各種信息的地址,在信息的傳遞過程中充當一個“橋梁”的作用。id指針的信息傳遞過程就是從子類開始,一個一個往上一級尋找是否有匹配的信息,把對象和類對象匹配起來,從而實現消息的傳遞過程。 isa的消息傳遞

類對象的方法鏈表

struct objc_method{ SEL method_name;//方法ID char* method_types;//方法類型(返回值、參數) IMP method_imp;//方法地址(IMP)函數調用

SEL IMP類型的作用和特點

SEL類型:selector,方法簽名相同則ID相同,與類無關IMP類型:implementation, 是一個指針類型,尋找到函數過后的函數調用,返回一個id typedef id(*IMP)(id, SEL,...)@autoreleasepool{Person *a = [[Person alloc] init];[a PRint];SEL act = @selector("print");//act得到print的SEL//或者 SEL act = NSSelectorFromString(@"print");從字符串獲得方法的SEL//或者NSSring * name = NSStringFromSelector(act);從const char * sn = sel_getName(act);//用SEL做參數,找到指定的方法,并取得其首地址a.name = @"tom";NSLog(@"%s",sn);IMP p = [a methodForSelector:act];p(a, act);//p就相當于*IMP【typedef id(*IMP)】(id, SEL,...),a相當于self,act即為SELfor (int i=0; i<10000; i++){ //[a print]; p(a, act); }//在循環次數很多的情況下,如果用第一種方法,消息傳遞的方法名尋找過程很耗費時間,所以如果改進為第二種方法,可以節省很多時間}

動態類型識別的常用方法

如何得到類對象

Class rectClass=[Rectangle class];//通過類名得到類對象Class aClass=[anObject class];//通過實例得到類對象if([obj1 class] == [obj2 class])//兩個類對象是否為同類

類(對象)和字符串

Class someClass = NSClassFromString(@"NSView");id object = [[someClass alloc]init];//從字符串得到類對象NSString *view = NSStringFromClass([NSView class]);NSString *className = NSStringFromClass([anObject class]}//從類或者類對象得到類名的字符串

判定與應用

判定類與成員

class-object類對象的寫法:[類名或者對象名 class]

-(BOOL)isKindOf:class-object//對象是不是class-object或者其子類的成員-(BOOL)isMemberOfClass:class-object//對像是不是class-object的成員if([object isMemberOf:[someClass class]])//判定是否為某個類的實例對象+(BOOL)isSubclassOfClass:class-object//對象是指定類的子類嗎

是否響應

等號右邊selector的寫法:@selector(方法名、@“字符串”)

-(BOOL)respondToSelector:selector//對象是否能響應selector所指定的方法+(BOOL)instancesRespondToSelector:selector//指定的類對象是否能響應selector

應用

-(id)performSelector:selector//應用selector指定的方法-(id)performSelector:selector withObject:object//應用selector指定的方法,傳遞參數object1-(id)performSelector:selector withObject:object withObject:object2//應用selector指定的方法,傳遞參數object1,傳遞參數object2..........

靜態/動態類型識別的區別

靜態多態編譯之前就提供了對象信息,編譯時可以檢查(對象和類是否匹配,對象是否擁有指定的方法等)動態多態是在編譯時才確定對象信息,動態多態要求方法簽名、返回值、參數類型完全一致如果不涉及到多態,盡量使用靜態類型

動態綁定

消息派發:oc中消息一直到運行時才能綁定到對應的方法

[receiver message];轉換成函數 objc_msgSend(receiver, selector); 其中receivier賦值給self, selector就是方法選擇器

如果消息是 [super message]; 這里寫圖片描述 為了加快消息處理,運行時會緩存映射表,在每個類中查找方法會先在緩存中找,如果找不到再到方法映射表中去找

動態加載

oc允許在運行時加載一個新類,或給已有的類加載新的方法 只需要四步 1. #import 《objc/runtime.h> 2. 為class pair分配空間 3. 增加方法(class_addMethod)或者實例變量(class_addlvar) 4. 注冊新類

#import<objc/runtime.h>//注意引入void sayHello(id self,SEL_cnd,NSString* aHello){ NSLog(@"%@",aHello);}//-(void)sayHello:(NSString*)aHello;上面函數就時這個方法的等價寫法//void(*)(id self, SEL_cnd,NSString*);可以看出每個方法都有self和SEL兩個隱含參數@autoreleasepool{ Class parentClass=[NSObject class]; Class newClass=objc_allocateClassPair(parentClass,"ASNewClass",0);//為class pair分配空間 Class_addMethod(newClass,@selector(sayHello:),(IMP)sayHello,"v@:@"); //增加方法(class_addMethod)或者實例變量(class_addlvar) objc_registerClassPair(newClass);//注冊新類 id p = [[newClass alloc] init]; if([p respondsToSelector:@selector(sayHello:)]){ [p performSelector:@selector(sayHello:) withObject:@"hello world!"]; } }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宿松县| 定兴县| 禹州市| 南宁市| 抚顺县| 婺源县| 景德镇市| 屏南县| 新乐市| 随州市| 耿马| 江阴市| 年辖:市辖区| 正阳县| 晋宁县| 锡林郭勒盟| 红安县| 类乌齐县| 松溪县| 荆门市| 荥经县| 容城县| 囊谦县| 揭东县| 龙游县| 长武县| 三明市| 岑巩县| 莱芜市| 磴口县| 道孚县| 金秀| 永嘉县| 修水县| 武穴市| 沾化县| 海兴县| 镇安县| 遂平县| 漾濞| 云浮市|