文档章节

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

 明天过后1
发布于 2014/10/09 23:12
字数 734
阅读 31
收藏 0
点赞 0
评论 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
博文 20
码字总数 36166
作品 0
佛山
给大家分享黑马程序员Android课程笔记

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

小梦想家 ⋅ 2015/12/04 ⋅ 4

《从零开始学Swift》学习笔记(Day 69)——Swift与Objective-C混合编程之语言

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

智捷课堂 ⋅ 2016/02/24 ⋅ 0

TIOBE编程语言排行榜:Objective-C蝉联“年度语言”

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

oschina ⋅ 2013/01/06 ⋅ 46

为什么 Objective-C 很难

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

junwong ⋅ 2012/03/07 ⋅ 69

IOS学习笔记——Objective-c基础(一)

最近自学ios,ios的支持语言是Objective-c,所以要学习ios就需要先学习Objective-c语言。当掌握了Objective-c的基础知识之后,我们就可以入手学习iOS开发做出一些自己的应用。 我现在还是...

丛林迷雾 ⋅ 2012/12/30 ⋅ 1

这些编程语言程序员工资最高!Java 才第四

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

oschina ⋅ 2016/07/18 ⋅ 67

年度最佳编程语言 Objective-C当仁不让

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

博客园 ⋅ 2011/11/11 ⋅ 0

11月编程语言排行榜:Objective-C能成为年度编程语言?

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

vVqsGHcN ⋅ 2011/11/09 ⋅ 37

Swift 个人学习笔记 - 06: 控制流

本文章纯粹是中文版《The Swift Programming Language》的学习笔记,所以绝大部分的内容都是文中有的。本文是本人的学习笔记,不是正式系统的记录。仅供参考 以下还是有很多没看懂、不确定的...

amc ⋅ 2017/02/22 ⋅ 0

JavaWeb01-HTML篇笔记(一)

1.1 案例一:网站信息页面的显示:1.1.1 需求: 在网页中显示网站的信息的页面:效果如下: 1.1.2 分析:1.1.2.1 技术分析: 【HTML的概述】 Ø 什么是HTML HTML:Hyper Text Markup Language ...

我是小谷粒 ⋅ 04/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java集合类总结笔记

一、集合类的层次关系 主要容器集合类的特点: ArrayList 一种可以动态增长和缩减的索引序列 LinkedList 一种可以在任何位置进行高效地插入和删除的有序序列 ArrayDeque 一种用循环数组实现的...

edwardGe ⋅ 5分钟前 ⋅ 0

spring RMI远程调用

RMI https://www.cnblogs.com/wdh1995/p/6792407.html

BobwithB ⋅ 10分钟前 ⋅ 0

Jenkins实践2 之基本配置

1 插件管理 系统管理->插件管理 在可选插件中可以自主安装插件 2 管理用户 系统管理->管理用户->新建用户 3 安全配置 系统管理->全局安全配置 授权策略 选择安全矩阵 然后添加现有的用户,赋...

晨猫 ⋅ 10分钟前 ⋅ 0

c++智能指针

1、是一种泛型类,针对指针类型的泛型类,会保存指针 2、重载了符号 *和-> 对智能指针使用这两个符号,相当于对保存的泛型使用这两个符号 3、当智能指针引用计数为0时,会去释放指针指向的资...

国仔饼 ⋅ 11分钟前 ⋅ 0

Spring Boot错误处理机制

1)、SpringBoot默认的错误处理机制 默认效果: 1)、浏览器,返回一个默认的错误页面 浏览器发送请求的请求头: 2)、如果是其他客户端,默认响应一个json数据 原理: 可以参照ErrorMvcAut...

小致dad ⋅ 13分钟前 ⋅ 0

ftp连接不上的终极办法 SFTP

假如FTP由于各种原因就是连不上,那么用SFTP协议吧,使用登录服务器的账号密码。

sskill ⋅ 17分钟前 ⋅ 0

Unity 围绕旋转角度限制(Transform.RotateAround)

在 Unity 中可以利用 Transform.RotateAround 围绕指定物体进行旋转,但某些情况下可能需要对旋转角度进行控制。我是先计算出预设角度大小,然后判断是否在限定角度范围内是则进行旋转。 相关...

大轩 ⋅ 18分钟前 ⋅ 0

阿里沙箱环境支付宝测试demo

阿里支付宝支付和微信支付,包括:阿里沙箱环境支付宝测试demo,支付宝支付整合到spring+springmvc+mybatis环境和微信整合到如上环境,功能非常齐全,只需要修改对应的配置文件即可,帮助文档...

码代码的小司机 ⋅ 21分钟前 ⋅ 0

JDK1.6和JDK1.7中,Collections.sort的区别,

背景 最近,项目正在集成测试阶段,项目在服务器上运行了一段时间,点击表格的列进行排序的时候,有的列排序正常,有的列在排序的时候,在后台会抛出如下异常,查询到不到数据,而且在另外一...

tsmyk0715 ⋅ 38分钟前 ⋅ 0

C++ 中命名空间的 5 个常见用法

相信小伙伴们对C++已经非常熟悉,但是对命名空间经常使用到的地方还不是很明白,这篇文章就针对命名空间这一块做了一个叙述。 命名空间在1995年被引入到 c++ 标准中,通常是这样定义的: 命名...

柳猫 ⋅ 42分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部