oc中的"反射"理解

来源:互联网 发布:mac软件宝箱10.7.5 编辑:程序博客网 时间:2024/05/18 16:19

      原文引用:http://blog.csdn.net/victormokai/article/details/19631359

  

       java中的反射就是在代码运行中才创建对象,可以获取其中的方法,修改其中的属性值,OC中,也可以进行类似的处理。 


代码如下:

      

#import <Foundation/Foundation.h>@interface PersonTest : NSObject+(void) speak;@end


#import "PersonTest.h"@implementation PersonTest+(void) speak{    NSLog(@" i'm  a person !");}@end

#import <Foundation/Foundation.h>#import "PersonTest.h"@interface StudentTest : PersonTest{  @private  int  age;}@property(nonatomic) int age;-(StudentTest *) initAge:(int) _age;-(void) hobby;-(void) getScore:(int) score;-(NSString *) getStudentName: (NSString *) studentName;@end

#import "StudentTest.h"@implementation StudentTest@synthesize age;-(StudentTest *) initAge:(int) _age{    self = [super init];    if(self){        self.age = _age;    }    return self;}-(void) hobby{    NSLog(@"学生喜欢玩游戏, 上体育课。");}-(void) getScore:(int) score{    NSLog(@"获取学生的分数---%d",score);}-(NSString *) getStudentName: (NSString *) studentName{    NSLog(@"这个学生的名字----%@",studentName);    return studentName;}@end


OC中自带方法来进行“反射”处理。

                   //  反射  创建对象        Class  className = NSClassFromString(@"StudentTest");  // 类适  Class.forName(className)        StudentTest  *stu = [[className alloc] init];        NSLog(@"%@",stu);                        //      2、-(BOOL)isKindOfClass:(Class)aClass; 判断对象是不是属于指定类型或其子类        Boolean  flag = [stu isKindOfClass:[PersonTest class]];        NSLog(@"%d",flag);        if (flag) {            NSLog(@"studentTest 是 personTest的子类");        }else{            NSLog(@"studentTest 不是 personTest的子类");        }                //      3、- (BOOL)isMemberOfClass:(Class)aClass 判断对象是不是属于指定类型        Boolean boolFlag = [stu isMemberOfClass:[PersonTest class]];        NSLog(@"%d",boolFlag);        if(boolFlag){            NSLog(@"stu 是 PersonTest 类型");        }else{            NSLog(@"stu 不是 PersonTest 类型");        }                       //       4、- (BOOL)respondsToSelector:(SEL)aSelector  判断类型或对象有没有某个方法       Boolean   bool_flag  = [stu respondsToSelector:@selector(hobby)];  // 没有参数的方法       NSLog(@"%d",bool_flag);        if (bool_flag) {            NSLog(@"studentTest 类中有 hobby这个方法");        }else{            NSLog(@"studentTest 类中没有这个 hobby这个方法");        }        Boolean score_flag = [stu respondsToSelector:@selector(getScore:)]; // 带有参数的方法        NSLog(@"%d",score_flag);                //同时,对于@selector 还可以通过 字符串生成出来。        SEL  sel_flag = NSSelectorFromString(@"getScore:");        Boolean sel_score_flag = [stu respondsToSelector:sel_flag];        NSLog(@"换种方式来进行显示----%d",sel_score_flag);                //        5、- (id)performSelector:(SEL)aSelector  动态调用对象的方法                [stu performSelector:@selector(hobby)];  //调用无参函数                        [stu performSelector:@selector(getStudentName:) withObject:@"小强"]; // 调用有参函数                        //        - (BOOL)conformsToProtocol:(Protocol *)aProtocol; 判断对象是否实现某个Protocol协议


在这些中其中需要注意的是   

- (id)performSelector:(SEL)aSelector  动态调用对象的方法。 同时他和后面的IOS中的线程也有关联,先mark一下。
</pre><pre name="code" class="objc">运行结果如下:


2015-01-01 20:38:46.373 OC基础学习[779:43297] <StudentTest: 0x100202050>

2015-01-01 20:38:46.374 OC基础学习[779:43297] 1

2015-01-01 20:38:46.374 OC基础学习[779:43297] studentTest personTest的子类

2015-01-01 20:38:46.374 OC基础学习[779:43297] 0

2015-01-01 20:38:46.374 OC基础学习[779:43297] stu不是 PersonTest类型

2015-01-01 20:38:46.375 OC基础学习[779:43297] 1

2015-01-01 20:38:46.375 OC基础学习[779:43297] studentTest类中有 hobby这个方法

2015-01-01 20:38:46.375 OC基础学习[779:43297] 1

2015-01-01 20:38:46.375 OC基础学习[779:43297]换种方式来进行显示----1

2015-01-01 20:38:46.375 OC基础学习[779:43297]学生喜欢玩游戏,上体育课。

2015-01-01 20:38:46.375 OC基础学习[779:43297]这个学生的名字----小强



 

          

0 0