IOS反射机制的几个重要函数

/*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], x?@"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,否则返回FALSENSLog(@"\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反射机制的几个重要函数

相关文章:

你感兴趣的文章:

标签云: