ObjC(Objective-C)中的Class(類類型),Selector(選取器SEL),函數指標(IMP) 今天在園子裡看到了一篇牛文“ Objective-C 2.0 with Cocoa Foundation--- 5,Class類型,選取器Selector以及函數指標 ”,講得十分精彩,忍不住把它的代碼加上注釋整理於此,以便日後查看。 個人體會:obj-C中的“Class類型變數”比c#中的Object基類還要靈活,可以用它產生任何類型的執行個體(但是它又不是 NSObject)。而選取器SEL與函數指標IMP,如果非要跟c#扯上關係的話,這二個結合起來,就點類似c#中的反射+委託,可以根據一個方法名稱字串,直接調用方法。 "牛"的基類 Cattle.h view source print ?
1 |
#import <Foundation/Foundation.h> |
3 |
@interface Cattle : NSObject { |
7 |
- (void)setLegsCount:(int) count; |
Cattle.m view source print ?
03 |
@implementation Cattle |
07 |
NSLog(@"Hello, I am a cattle, I have %d legs.", legsCount); |
10 |
-(void) setLegsCount:(int) count |
子類“公牛" Bull.h view source print ?
01 |
#import <Foundation/Foundation.h> |
04 |
@interface Bull : Cattle { |
08 |
- (NSString*) getSkinColor; |
09 |
- (void) setSkinColor:(NSString *) color; |
Bull.m view source print ?
08 |
NSLog(@"Hello, I am a %@ bull, I have %d legs.", [self getSkinColor],legsCount); |
11 |
-(NSString*) getSkinColor |
16 |
- (void) setSkinColor:(NSString *) color |
代理類DoProxy.h (關鍵的代碼都在這裡) view source print ?
01 |
#import <Foundation/Foundation.h> |
04 |
#define SET_SKIN_COLOR @"setSkinColor:" |
05 |
#define BULL_CLASS @"Bull" |
06 |
#define CATTLE_CLASS @"Cattle" |
09 |
@interface DoProxy : NSObject { |
17 |
//定義一個函數指標(傳統C語言的處理方式) |
18 |
void(*setSkinColor_Func)(id,SEL,NSString*); |
20 |
//定義一個IMP方式的函數指標(obj-C中推薦的方式) |