Objective-C的内省(Introspection)小结
内省(Introspection)是面向对象语言和环境的一个强大特性,Objective-C和Cocoa在这个方面尤其的丰富。内省是对象揭示自己作为一个运行时对象的详细信息的一种能力。这些详细信息包括对象在继承树上的位置,对象是否遵循特定的协议,以及是否可以响应特定的消息。NSObject协议和类定义了很多内省方法,用于查询运行时信息,以便根据对象的特征进行识别。
明智地使用内省可以使面向对象的程序更加高效和强壮。它有助于避免错误地进行消息派发、错误地假设对象相等、以及类似的问题。
下面的部分将介绍如何在代码中有效地使用NSObject的内省方法。
1、isKindOfClass:Class
检查对象是否是那个类或者其继承类实例化的对象
2、isMemberOfClass:Class
检查对象是否是那个类但不包括继承类而实例化的对象
示例:
- if ([item isKindOfClass:[NSData class]]) {
- const unsigned char *bytes = [item bytes];
- unsigned int length = [item length];
- // ...
- }
if ([item isKindOfClass:[NSData class]]) {
const unsigned char *bytes = [item bytes];
unsigned int length = [item length];
// ...
}
如果item是NSMutableData类实例化的对象,而该类是NSData类的子类,那么[item isKindOfClass:[NSData class]]的值也是TRUE,而[item isMemberOfClass:[NSData class]]的值则为False。 如果item是NSData类实例化的对象,那么[item isMemberOfClass:[NSData class]]的值则为TRUE。
3、respondToSelector:selector
检查对象是否包含这个方法
- - (void)doCommandBySelector:(SEL)aSelector {
- if ([self respondsToSelector:aSelector]) {
- [self performSelector:aSelector withObject:nil];
- } else {
- [_client doCommandBySelector:aSelector];
- }
- }
- (void)doCommandBySelector:(SEL)aSelector {
if ([self respondsToSelector:aSelector]) {
[self performSelector:aSelector withObject:nil];
} else {
[_client doCommandBySelector:aSelector];
}
}
4、conformsToProtocol:protocol
检查对象是否符合协议,是否实现了协议中所有的必选方法。
- // ...
- if (!([((id)testObject) conformsToProtocol:@protocol(NSMenuItem)])) {
- NSLog(@"Custom MenuItem, '%@', not loaded; it must conform to the
- 'NSMenuItem' protocol.\n", [testObject class]);
- [testObject release];
- testObject = nil;
- }
Objective-C的内省(Introspection)小结的更多相关文章
- OC中的内省(Introspection)方法
我们在写OC代码的时候经常用到:isKindOfClass: 一类的方法,但是对于它并没有一个了解,这里也是从网上搜索了一些内容,简单介绍并记录一下.这类方法就是属于OC的特性之一:内省. 内省(In ...
- Python函数的内省-Introspection
Python函数可以进行内省-Introspection,查看函数内部的细节,方式就是使用函数的__code__属性. def func(a, b = 2): return a + b >> ...
- cmake 的简单使用示例
https://www.zybuluo.com/khan-lau/note/254724 CMake 用法导览 Preface : 本文是CMake官方文档CMake Tutorial (http:/ ...
- 【总结】富有表现力的JavaScript
1.JavaScript的灵活性 JavaScript是目前最流行.应用最广泛的语言之一,它是一种极富表现力的语言,它具有C家族语言所罕见的特性.这种语言允许我们使用各种方式来完成同一个任务或者功能, ...
- IOS __ 面试题
1.下面四种内部排序算法中哪一种在最差的情况下时间复杂度最高:(B) A.快速排序 B.冒泡排序 C.堆排序 D.归并排序 2.Shell中,将command1的输出作为command2的输入应该 ...
- Hekaton的神话与误解
最近这段时间,我花了很多时间来更好的理解Hekaton——SQL Sever 2014里的全新内存表技术.我看了很多文章,了解了Haktaon的各种内部数据存储结构(主要是哈希索引和Bw-tree). ...
- python高级编程技巧
由python高级编程处学习 http://blog.sina.com.cn/s/blog_a89e19440101fb28.html Python列表解析语法[]和生成 器()语法类似 [expr ...
- [QT]QT概述
QT概述 基于C++的GUI开发框架,跨平台.Qt 是一个用于桌面系统和嵌入式开发的跨平台应用程序框架. QT是挪威TROLLTECH公司开发的跨平台C++工具,在UNIX下非常出名:他的宗旨是“一次 ...
- 常见形式 Web API 的简单分类总结
一.请求--响应API. 请求--响应类的API的典型做法是,通过基于HTTP的Web服务器暴露一个/套接口.API定义一些端点,客户端发送数据的请求到这些端点,Web服务器处理这些请求,然后返回响应 ...
随机推荐
- oracle 数据导入导出命令
1.数据导出: 1 将数据库TEST完全导出,用户名system 密码manager 导出到D:\daochu.dmp中 exp system/manager@TEST file=d:\daoc ...
- VS2012添加ADO实体数据模型
最近更新了开发工具为VS2012,在使用EntityFramework创建实体数据模型的时候,在添加选项中找不到这个选项. 确定了自己已经安装了EntityFramework,猜到估计是版本的问题,于 ...
- 【转】用java实例学习MVC模式
.1 MVC模式 MVC是三个单词的缩写,这三个单词分别为:模型(Model).视图(View)和控制(Controller).MVC模式的目的就是实现Web系统的职能分工.下面以J2EE开发进行介绍 ...
- sql with as用法详解
一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个SQL语句所用到.有的时候,是为了让 ...
- python基础:day3作业
修改haproxy配置文件 基本功能:1.获取记录2.添加记录3.删除记录 代码结构:三个函数一个主函数 知识点:1.python简单数据结构的使用:列表.字典等 2.python两个模块的使用:os ...
- HDU1042 N! 大数的阶乘
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 由于数字特别大, 所以用数组来模拟. 经测试, 数组大小开50000 可过. 附AC代码, 欢迎 ...
- ubuntu 常用参数设置
在Linux下,对于参数的设置,一般来说,都遵循这个规律.每一个功能程序,一定对于一个对于名字的配置文件. 涉及到多用户的功能配置,一定有一个全局的配置文件,对所有用户都生效,而每个用 ...
- qt QLabel 显示网络图片
在网上试了很多代码都不能使用,自己写了写代码. 直接上代码 Codevoid QMusicLogo::setNetworkPic(const QString &szUrl) { QUrl ur ...
- 基于OCILIB的oracle数据库操作总结及自动生成Model和Dao的工具
基于OCILIB的oracle数据库操作总结 1. 类图 2. 基类BaseOCIDao的设计与实现 BaseOCIDao.h头文件 #pragma once /* ----- ...
- zedboard 中SDK 修改串口设置(波特率。。。。)
其实在zedboard SDK中不用初始化串口的也就是platform()可以不写 ,初始化在EDK导入SDK中就写好了 具体看bsp文件夹下面的汇编.但是如果我们想要在SDK中改变串口设置的话 ...