Objective-C的内省(Introspection)

内省(Introspection)是面向对象语言和环境的一个强大特性,Objective-C和Cocoa在这个方面尤其的丰富。内省是对象揭示自己作为一个运行时对象的详细信息的一种能力。这些详细信息包括对象在继承树上的位置,对象是否遵循特定的协议,以及是否可以响应特定的消息。NSObject协议和类定义了很多内省方法,用于查询运行时信息,以便根据对象的特征进行识别。

明智地使用内省可以使面向对象的程序更加高效和强壮。它有助于避免错误地进行消息派发、错误地假设对象相等、以及类似的问题。

下面的部分将介绍如何在代码中有效地使用NSObject的内省方法。

1

isKindOfClass:Class

检查对象是否是那个类或者其继承类实例化的对象

1

isMemberOfClass:Class

检查对象是否是那个类但不包括继承类而实例化的对象

示例:

Objective-c代码

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

检查对象是否包含这个方法

Objective-c代码

- (void)doCommandBySelector:(SEL)aSelector {

if ([self respondsToSelector:aSelector]) {

[self performSelector:aSelector withObject:nil];

} else {

[_client doCommandBySelector:aSelector];

}

}

4

conformsToProtocol:protocol

检查对象是否符合协议,是否实现了协议中所有的必选方法。

Objective-c代码

// ...

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;

}

原文发布于微信公众号 - iOS开发笔记(roclel)

原文发表时间:2016-03-31

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏MelonTeam专栏

Objective-C内存管理原理探究(一)

导语 让我们通过源代码了解OC内存管理的机制。 前言 相信每个人在开发iOS的过程中都有过OC是如何管理内存的疑问,虽然大家都知道是基于引用计数的...

21310
来自专栏Ldpe2G的个人博客

Graphviz4S ---- 在Scala中使用DOT语言绘图的开源工具

1936
来自专栏魂祭心

原 荐 NEO VM原理及其实现

4198
来自专栏函数式编程语言及工具

Akka(24): Stream:从外部系统控制数据流-control live stream from external system

 在数据流应用的现实场景中常常会遇到与外界系统对接的需求。这些外部系统可能是Actor系统又或者是一些其它类型的系统。与这些外界系统对接的意思是在另一个线程...

22410
来自专栏算法修养

CodeForces 664A Complicated GCD

A. Complicated GCD time limit per test 1 second memory limit per test 256 ...

2897
来自专栏HansBug's Lab

1984: 月下“毛景树”

1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MB Submit: 1003  Solved: 324 ...

2743
来自专栏积累沉淀

干货--Hadoop自定义数据类型和自定义输入输出格式整合项目案例

正文开始前 ,先介绍几个概念 序列化 所谓序列化,是指将结构化对象转化为字节流,以便在网络上传输或写到磁盘进行永久存储。 反序列化 是指将字节流转回到结构化...

5716
来自专栏云时之间

数据结构(三):栈与队列

3.1❶若按教科书3.1.1节中图3.1(b)所示铁道进行车厢调度(注意:两侧铁道均为单向行驶道),则请回答: ? (1) 如果进站的车厢序列为123,则可能...

3607
来自专栏pangguoming

JDBC上关于数据库中多表操作一对多关系和多对多关系的实现方法

我们知道,在设计一个Java bean的时候,要把这些BEAN 的数据存放在数据库中的表结构,然而这些数据库中的表直接又有些特殊的关系,例如员工与部门直接有一对...

8347
来自专栏个人分享

Hive metastore整体代码分析及详解

  从上一篇对Hive metastore表结构的简要分析中,我再根据数据设计的实体对象,再进行整个代码结构的总结。那么我们先打开metadata的目录,其目录...

3783

扫码关注云+社区