IOS反射機制的幾個重要函數

來源:互聯網
上載者:User

標籤:

/*object-c的文法學習main.mmmade by davidsu33-(BOOL)isKindOfClass:            classObj                     是否是其子孫或一員-(BOOL)isMemberOfClass:            classObj         是否是其一員-(BOOL)respondsToSelector:            selector         是否有這種方法+(BOOL)instancesRespondToSelector:            selector         類的對象是否有這種方法-(id)performSelector:            selector         執行對象的方法*/#import <Foundation/Foundation.h>typedef struct{    float x,y,w,h;}Rect;typedef struct{    float x,y;}Point;@protocol DSShape@optional- (int) getArea;@optional- (Rect) getBoundingRect;@optional- (NSMutableArray*) getPointArray;@end@interface DSRectangle : NSObject<DSShape>{    Rect _rect;    NSString* _name;}@property (readwrite, nonatomic)Rect rect;@property(readwrite, nonatomic)NSString *name;- (id) init;- (void) dealloc;- (NSString*) className;- (BOOL) isSqure;- (void) showInfo;- (Rect) getBoundingRect;@end@implementation DSRectangle@synthesize rect = _rect, name = _name;- (id) init{    if(self = [super init])    {        self.rect = Rect{0,0,0,0};        self.name = nil;        NSLog(@"%@ initialize", [self className]);    }    return self;}- (void) dealloc{    NSLog(@"%@ dealloc", [self className]);}- (NSString*) className{    return NSStringFromClass([self class]);}- (BOOL) isSqure{    return self.rect.w == self.rect.h;}- (void) showInfo{    id s = [[NSString alloc] initWithFormat:@"x=%f,y=%f,w=%f,h=%f, name=%@",_rect.x,                                        _rect.y,_rect.w,_rect.h,self.name];    NSLog(@"DSRectangle: %@",s);}- (Rect) getBoundingRect{    return self.rect;}@end@interface DSSqure : DSRectangle- (id) init;- (void) dealloc;- (float) sideLength;@end@implementation DSSqure- (id) init{    if(self = [super init])    {        NSLog(@"%@ initialize", [self className]);    }    return self;}- (void) dealloc{    NSLog(@"%@ dealloc",[self className]);}- (float) sideLength{    return self.rect.w;}@end#define SyntaxTest(x)    do{        NSLog(@"%@ = %@", [[NSString alloc] initWithCString:#x], [email protected]"TRUE":@"FALSE");    }while(0)void dynamic_attr_test(){    DSRectangle *re = [[DSRectangle alloc] init];    re.name = @"Rectangle";    re.rect = Rect{10,20,200,300};    DSSqure *sq = [[DSSqure alloc] init];    sq.name = NSStringFromClass([sq class]);    sq.rect = Rect{30,40,500,600};    //NSLog(@"rectangle name:%@", re.name);    [re showInfo];    [sq showInfo];    NSLog(@"\n-------------------isKindOfClass-----------------");    SyntaxTest([re isKindOfClass: [NSObject class]]);    SyntaxTest([re isKindOfClass: [DSRectangle class]]);    SyntaxTest([DSRectangle isKindOfClass: [NSObject class]]);    SyntaxTest([DSRectangle isKindOfClass: [DSRectangle class]]);    //動態文法測試    //isKindOfClass 對象是否是該類,或者該類祖先的執行個體    SyntaxTest([re isKindOfClass: [NSObject class]]);    SyntaxTest([re isKindOfClass: [DSRectangle class]]);    //isMemberOf 對象是否是某一個類的執行個體    NSLog(@"\n-------------------isMemberOfClass-----------------");    SyntaxTest([re isMemberOfClass: [NSObject class]]);    SyntaxTest([re isMemberOfClass: [DSRectangle class]]);    SyntaxTest([DSRectangle isMemberOfClass: [NSObject class]]);    SyntaxTest([DSRectangle isMemberOfClass: [DSRectangle class]]);    //如果執行個體是輸入參數,則selector是類的成員函數返回TRUE    //如果類名稱是輸入參數,則selector是類的靜態函數返回TRUE,否則返回FALSE    NSLog(@"\n-------------------respondsToSelector-----------------");    SyntaxTest([re respondsToSelector: @selector(init)]);    SyntaxTest([re respondsToSelector: @selector(NoThat)]);    SyntaxTest([re respondsToSelector: @selector(showInfo)]);    SyntaxTest([DSRectangle respondsToSelector: @selector(init)]);    SyntaxTest([DSRectangle respondsToSelector: @selector(NoThat)]);    SyntaxTest([DSRectangle respondsToSelector: @selector(showInfo)]);    //查看協議介面    SyntaxTest([re respondsToSelector: @selector(getArea)]);    SyntaxTest([re respondsToSelector: @selector(getBoundingRect)]);    SyntaxTest([DSRectangle respondsToSelector: @selector(getArea)]);    SyntaxTest([DSRectangle respondsToSelector: @selector(getBoundingRect)]);    //判斷該方法是執行個體介面(類成員函數)還是類函數(靜態函數)    NSLog(@"\n-------------------instancesRespondToSelector-----------------");    /*SyntaxTest([re instancesRespondToSelector: @selector(init)]);    SyntaxTest([re instancesRespondToSelector: @selector(NoThat)]);    SyntaxTest([re instancesRespondToSelector: @selector(showInfo)]);    */    //instancesRespondToSelector只能輸入類,不能寫其他的    SyntaxTest([DSRectangle instancesRespondToSelector: @selector(init)]);    SyntaxTest([DSRectangle instancesRespondToSelector: @selector(NoThat)]);    SyntaxTest([DSRectangle instancesRespondToSelector: @selector(showInfo)]);    /*    1. respondsToSelector既可以檢查類(是否響應指定類方法),也可以檢查執行個體(是否響應指定執行個體方法)    2. instancesRespondToSelector只能寫在類名後面,但檢測的是執行個體(是否響應指定執行個體方法)    可以認為[Test instancesRespondToSelector:sel]等價於[obj respondsToSelector:sel]    */    //[re release];    //[sq release];}int main(){    id arp = [[NSAutoreleasePool alloc] init];    dynamic_attr_test();    getchar();    [arp drain];    return 0;}

IOS反射機制的幾個重要函數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.