oc中的"反射"理解

      原文引用: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值