文档章节

黑马程序员-14-Objective-C学习笔记(反射)

 明天过后1
发布于 2014/10/09 23:12
字数 734
阅读 32
收藏 0

---------------------- Java培训.Net培训Android培训IOS培训、期待与您交流! ----------------------

1.  简介

    概念 : 指程序可以访问、检测和修改它本身状态或行为的一种能力。在java中对反射已经有一个感性的认识 : 

        (1) 可以通过一些字符串来创建一个类的实例

        (2) 可以判断实例的继承结构

        (3) 可以通过字符串来调用对象的方法

       (4) 可以检查成员变量的类型,值等等。

     OC中的反射特性大部分来自于NSObject,和Foundation定义的一些函数。那么在OC中对象实例是通过类对象的实例来创建的,

     那么创建对象可以分为两步 :

        (1) 根据字符串获取类对象

        (2) 利用类对象来实例化对象

2. 使用

/*************************************        Person.h        ********************************************/
// Person.m省略
#import <Foundation/Foundation.h>

@interface Person : NSObject
@property (nonatomic,assign) int age;
@end

/*************************************        Student.h        ********************************************/
#import "Person.h"
// 定义一个协议
@protocol TestDelegate <NSObject>
- (void) sayHello;
@end

// 遵守该协议
@interface Student : Person <TestDelegate>
@property (nonatomic,strong) NSString *name;
@end

/*************************************        Student.m        ********************************************/
#import "Student.h"

@implementation Student

-(void)sayHello
{
    NSLog(@"hello,my name is %@ ,age is %d",_name,[self age]);
}

@end

/*************************************        main.m        ********************************************/
// 默认开启ARC
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 通常我们创建一个对象都是使用以下方法
        // Person *p = [[Person alloc] init];
 /**************************已知一个字符串创建一个实例*****************************/
        // 获取类对象
        Class personClass = NSClassFromString(@"Person");
        // 利用类对象创建实例
        Person *p = [[personClass alloc] init];
        // 访问实例的方法
        p.age = 10;
        NSLog(@"age = %d",p.age);
        
/*********************************检查继承关系************************************/
        Student *s = [[Student alloc] init];
        s.name = @"Mike";
        s.age = 10;
        
        // 模糊检查 : 对于属于该类或者该类的子类的实例都成立
        if ( [s isKindOfClass:personClass] ) {
            NSLog(@"Student is a kindof class of Person");
        }
        
        // 精确检查 : 只成立于属于该类的实例,对于子类实例不成立
        if ( [s isMemberOfClass:personClass] ) {
            NSLog(@"s is an instanceof Person");
        } else if ( [p isMemberOfClass:personClass] ){
            NSLog(@"p is an instanceof Person");
        }

/*********************************方法的检查************************************/
        // 通过字符串创建一个SEL对象
        SEL setAge = NSSelectorFromString(@"setAge:");
        // 判断该对象是否含有 setAge: 这个方法
        if ( [s respondsToSelector:setAge] ) {
            NSLog(@"s has a method name setAge:");
        }
        
        // 方法调用
        // 直接调用
        [s setName:@"mike"];
        // 间接调用
        [s performSelector:setAge withObject:@"Mike"];
/*********************************协议的检查************************************/
        Protocol *test = NSProtocolFromString(@"TestDelegate");
        // 检查是否遵守某个协议
        if ( [s conformsToProtocol:test] ) {
            NSLog(@"s has comfirm the protocol : TestDelegate");
        }
        // 检查是否存在协议中的你某个方法
        if ( ![s respondsToSelector:test] ) {
            NSLog(@"Student没有实现test这个方法");
        }
    }
    return 0;
}

    

3. 总结

    (1) 通过字符串获取对象一些运行时的信息通常都是 NS...FromString(NSString *)(例如 : NSStringFromClass,NSSelectorFromString等等)

    (2) 判断对象的继承的关系关键方法 : [obj isKindOfClass:aClass],可以判断子类; [obj isMemberOfClass:aClass],精确判断,不能用于判断子类

    (3) 判断对象是否遵守某个协议关键方法 : [obj conformsToProtocol:aSel];



---------------------- Java培训.Net培训Android培训IOS培训、期待与您交流! ---------------------- 

 详情请查看:http://edu.csdn.net/heima



© 著作权归作者所有

共有 人打赏支持
粉丝 2
博文 23
码字总数 36166
作品 0
佛山
私信 提问
给大家分享黑马程序员Android课程笔记

黑马程序员课程笔记,这套笔记目的是让黑马的学员能够有一个详细的课下资料,也非常适合想学习Android的同学。 这套课程笔记包含内容: 1.Android基础视频部分: 2.Android360项目: 3.智慧北...

小梦想家
2015/12/04
2.4K
4
《从零开始学Swift》学习笔记(Day 69)——Swift与Objective-C混合编程之语言

《从零开始学Swift》学习笔记(Day 69)——Swift与Objective-C混合编程之语言 原创文章,欢迎转载。转载请注明:关东升的博客 在Swift语言出现之前,开发iOS或OS X应用主要使用Objective-C...

智捷课堂
2016/02/24
25
0
TIOBE编程语言排行榜:Objective-C蝉联“年度语言”

TIOBE发布了最新的编程语言排行版,Objective-C连续第2年获得“年度语言”殊荣。年度语言是指在上一年份额增长最多的语言。Objective-C最新的份额为10.283%,比去年同期增长了3.37%。在2010年...

oschina
2013/01/06
6.2K
46
年度最佳编程语言 Objective-C当仁不让

【IT168 资讯】Tiobe 公布了2011年11月编程语言排行榜,前二十排名无多大变化。从下图的排行榜可以看到,依然是C阵营的天下。   距 Tiobe 发布2011年年度编程语言只有两个月的时间了,这个...

博客园
2011/11/11
0
0
为什么 Objective-C 很难

作为一个Objective-C的coder,我总能听到一部分人在这门语言上抱怨有很多问题。他们总在想快速学习这门语言来写一个App出来,但他们也总是联想到Objective-C看上去实在太难了或者在想这些语法...

junwong
2012/03/07
166.4K
69

没有更多内容

加载失败,请刷新页面

加载更多

slot分发内容

slot元素作为组件模板之中的内容分发插槽。这个元素自身将被替换。 有 name 特性的 slot 称为具名 slot。 有 slot 特性的内容将分发到名字相匹配的具名 slot。 内容分发就是指混合父组件的内...

Carbenson
8分钟前
1
0
python开发入门

1.执行python文件 # python ./demo.py 2.Python ImportError: No module named 'requests'异常 解决方法: # pip install requests;...

硅谷课堂
9分钟前
1
0
官宣,PyTorch 1.0 稳定版本现已推出

简评:快来一起快乐地学习吧。 随着 PyTorch 生态系统和社区继续为开发人员提供有趣的新项目和教育资源,今天(12 月 7日)在 NeurIPS 会议上发布了 PyTorch 1.0 稳定版。研究人员和工程师现...

极光推送
22分钟前
1
0
对比理解adr,ldr指令

很多人在写简单的裸机代码或分析uboot时,常常遇到adr ldr指令。却分不清这2者的区别,今天就来谈谈adr与ldr指令。 参照韦老师的代码和Makefile写了test_adr.S: .text .globl _start _start...

天王盖地虎626
33分钟前
2
0
将spring boot 项目注册为Linux的服务

springboot 注册为Linux系统服务 springboot 注册为Linux系统服务

miaojiangmin
35分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部