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

/*
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], [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;
}

时间: 2024-10-09 19:48:31

IOS反射机制的几个重要函数的相关文章

ios 反射机制

// Created  By   郭仔  2015年04月11日17:13:22 NSObject常用方法: ======================================================================= OC反射机制:

iOS反射机制: objc_property_t的使用

iOS属性反射:说白了,就是将两个对象的所有属性,用动态的方式取出来,并根据属性名,自动绑值.(注意:对象的类,如果是派生类,就得靠其他方式来实现了,因为得到不该基类的属性.) 常用的反射方式,有如下两种: 从一个自定义实体类->自定义实体类 从一个NSDictionary->自定义实体类(此方式最最常用,如网络Json数据会组成NSDictionary.sqlite查询数据,可以用第三方组件组成NSDictionary)直接上码,(这里码在NSObject类别中)获取对象所有属性:- (NS

Python的反射机制、hasattr() getattr() setattr() 函数使用方法详解

hasattr(object, name)判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False.需要注意的是name要用括号括起来 1 >>> class test(): 2 ... name="xiaohua" 3 ... def run(self): 4 ... return "HelloWord" 5 ... 6 >>> t=test() 7 >>&

【iOS开发系列】用简单工厂模式理解OC反射机制

// 在iOS开发中,简单工厂模式使用得并不多.但是.我认为这是OC反射机制很好的一个例子, // 所以本文将以计算器为例,讲解简单工厂模式和OC的反射机制. // [简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类( // 这些产品类继承自一个父类或接口)的实例.该模式中包含的角色及其职责:工厂角色.抽 // 象产品角色.具体产品角色] // --百度百科 简单工厂模式 // 上面这句话可能不怎么好理解,我在网上找到了一个例子,可能例子本身不能完全解释这个 // 设

黑马程序员----java基础--反射机制

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.反射的基本描述 Java反射机制是在运行状态中,对于任意一个类(class文件),都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象方法的功能称为java语言的反射机制.动态获取类中信息,就是java反射.可以理解为对类的解剖.如果想要对指定名称的字节码文件进行加载并获取其中的内容并调用,这时就使用到了反射技术. 简单一

Python学习心得(六) 反射机制、装饰器

1.反射机制 #/usr/bin/env python # -*- coding:utf-8 -*- ''' Python反射机制的核心本质:利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动 通俗讲就是通过用户传入url的不同,调用不同的模块函数,好多比较流行的web框架都是通过反射的机制,根据url的不同指向不同的模块 getattr(),hasattr(),setattr(),delattr()对模块的修改都在内存中进行,并不会影响文件中的真实内容

Java中的反射机制

Java反射的概念 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制 Java反射机制主要提供下面几种用途: 1.在运行时判断任意一个对象所属的类 2.在运行时构造任意一个类的对象 3.在运行时判断任意一个类所具有的成员变量和方法 4.在运行时调用任意一个对象的方法 首先看一个简单的例子,通过这个例子来理解Java的反射机制是如何工作的 i

java学习——反射机制

/* * JAVA反射机制是在运行状态中,对于任意一个类 (class文件),都能够知道这个类的所有属性和方法: * 对于任意一个对象,都能够调用它的任意一个方法和属性: * 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. * * 动态获取类中信息,就是java反射 . * 可以理解为对类的解剖. * * 要想要对字节码文件进行解剖,必须要有字节码文件对象. * 如何获取字节码文件对象呢? * */ 1. 通过Class clazz =Class.forName()找

17.Java 反射机制

1.反射的定义 反射之中包含了一个"反"的概念,所以要想解释反射就必须先从"正"开始解释,一般而言,当用户使用一个类的时候,应该先知道这个类,而后通过这个类产生实例化对象,但是"反"指的是通过对象找到类. 2.Class对象 2.1 概述 Class对象是反射的起点,可以利用类的Class对象创建类的实例(newInstance),同时提供了操作类的工具,可以获取类的详细信息,并且使用特殊的技术实现类的加载(运行时加载,在编译的时候还没有该类的c