文档章节

黑马程序员-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
《从零开始学Swift》学习笔记(Day 69)——Swift与Objective-C混合编程之语言

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

智捷课堂
2016/02/24
25
0
为什么 Objective-C 很难

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

junwong
2012/03/07
164.4K
69
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

没有更多内容

加载失败,请刷新页面

加载更多

WinDbg

参考来自:http://www.cnit.net.cn/?id=225 SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols ctrl + d to open dump_file Microsoft (R) Windows Debugger Version 6.12.0002.633......

xueyuse0012
今天
2
0
OSChina 周五乱弹 —— 想不想把92年的萝莉退货

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @罗马的王:分享松澤由美的单曲《地球ぎ》 很久没看圣斗士星矢了 《地球ぎ》- 松澤由美 手机党少年们想听歌,请使劲儿戳(这里) @开源中国首...

小小编辑
今天
14
1
springBoot条件配置

本篇介绍下,如何通过springboot的条件配置,控制Bean的创建 介绍下开发环境 JDK版本1.8 springboot版本是1.5.2 开发工具为 intellij idea(2018.2) 开发环境为 15款MacBook Pro 前言 很多时候,...

贺小五
今天
1
0
javascript source map 的使用

之前发现VS.NET会为压缩的js文添加一个与文件名同名的.map文件,一直没有搞懂他是用来做什么的,直接删除掉运行时浏览器又会报错,后来google了一直才真正搞懂了这个小小的map文件背后的巨大...

粒子数反转
昨天
1
0
谈谈如何学Linux和它在如今社会的影响

昨天,还在农耕脑力社会,今天已经人工智能技术、大数据、信息技术的科技社会了,高速开展并迅速浸透到当今科技社会的各个方面,Linux日益成为人们信息时代的到来,更加考验我们对信息的处理程...

linux-tao
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部