标签:
/*
object-c的语法学习
main.mm
made 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,否则返回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;
}
标签:
原文地址:http://blog.csdn.net/davidsu33/article/details/44753451