文档章节

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

 明天过后1
发布于 2014/10/09 23:12
字数 734
阅读 31
收藏 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.3K
4
为什么 Objective-C 很难

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

junwong
2012/03/07
164.4K
69
《从零开始学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.1K
46
这些编程语言程序员工资最高!Java 才第四

在众多行业中,程序员属于高薪职业。无论是在国外还是国内,程序员的薪金水平普遍高于其他行业的工作岗位。 高薪的诱惑和充满挑战性的工作,令程序员一直成为备受欢迎的职业。在今年年初,G...

oschina
2016/07/18
13.9K
67

没有更多内容

加载失败,请刷新页面

加载更多

下一页

postman发送json格式的post请求

postman发送json格式的post请求 在地址栏里输入请求url:http://127.0.0.1:8081/getmoney 选择“POST”方式, 在“headers”添加key:Content-Type , value:application/json 点击"body",''ra...

两广总督bogang
8分钟前
0
0
Javascript将html转成pdf,下载(html2canvas 和 jsPDF)

最近碰到个需求,需要把当前页面生成pdf,并下载。弄了几天,自己整理整理,记录下来,我觉得应该会有人需要 :) 项目源码地址:https://github.com/linwalker/render-html-to-pdf html2ca...

孟飞阳
9分钟前
0
0
pureftp源码编译及设定

--- use for RHEL 567 and Ubuntu 1604 1. download pureftpd wget http://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-1.0.47.tar.bz2 2. install gcc #apt-get install -y li......

zzimac
11分钟前
0
0
Android 事件分发 简单学

本文地址:https://my.oschina.net/lifj/blog/1928132 Android 事件分发过程 网上有很多这样的文章,我又写了一篇,希望能够清晰明了的告诉大家整体的事件分发过程,而不是一脸懵逼的进来,一...

拉风的道长
11分钟前
0
0
手相学 - 天尊山道人看相算命

手相学 - 天尊山道人看相算命 手并拢,左右手正面,背面,小指侧面共六张照片,(可选:舌象、面相)。光线,自然光较好,非阳光直射。 EM4KBJK}Y9Z6ONEL(C~DDV.jpg 生命线 生命线:由拇指与食...

python测试开发人工智能安全
12分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部