内省(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];
// ...
}
如果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];
}
}
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)是一种强大的编程特性,允许程序在运行时查询和分析对象的特性。这种能力使得开发者能够动态地了解对象的结构和行为,从而编写出更加灵活和适应性强的代码。Objective-C中的内省...
10. **Cocoa设计模式**,如委托模式(Delegation)、懒加载(Lazy Initialization)、错误报告(Error Reporting)、键值观察(Key-Value Observing)、目标动作(Target-Action)、内省(Introspection)等。 11. **与C API的...
在本文中,我们将深入探讨Laravel开发中的一个重要概念——OAuth 2.0令牌内省(Token Introspection),以及如何在Laravel Passport中实现它。`laravel-oauth-introspection-master`是一个压缩包,其中包含了一个...
容器内省(Introspection)是指一种能力,通过这种能力,我们可以检查和理解容器的内部状态,包括其配置、资源限制、运行时环境、依赖关系以及与其他容器或宿主机的交互方式。这对于监控、调试、安全审计以及优化...
graphql-disable-introspection 使用简单的验证规则在GraphQL中禁用自省查询。 包含__schema或__type查询将无法通过此规则进行验证。 例如,以下查询将被拒绝: query { __schema { queryType { name } } } ...
Objective-C库源码,源码FXForms,FXForms是一个Objective-C库,用以为app设置页面或用户数据输入任务创建表单。与其他解决方案不同,FXForms适用于强类型数据模型(而不是dictionaries或者复杂的数据源协议),并从...
码-对象反省码插件,用于基于GObject-Intropection构建库文档。要求Ruby / GObject-...gem install yard-gobject-introspection执照版权所有(c)2016 Ruby-GNOME2项目团队该程序是免费软件。 您可以根据GNU
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
Apollo Server插件,允许将元数据添加到GraphQL内省查询响应中。 安装 使用npm: npm install --save-prod @anvilco/apollo-server-plugin-introspection-metadata 使用纱: yarn add @anvilco/apollo-server-...
离线安装包,亲测可用
虚拟机内省技术研究,杨先强,双锴,随着云计算的流行,虚拟机内省(Virtual Machine Introspection, VMI)技术及工具逐渐被用来监控IaaS云中虚拟机的行为。在这些技术的帮助下,�
3. 当修改了头文件后,所有依赖该头文件的C文件都需要重新编译。 4. 如果修改了Makefile本身,所有相关联的目标都需要重新构建。 #### 五、Makefile的关键组成部分 1. **目标**:Makefile中的每个目标代表了一个...
液化天然气LGI是基于gobject内省的动态Lua绑定到基于GObject的库。 它允许直接从Lua使用基于GObject的库。 已获得许可的许可,请参见LICENSE文件全文。 该项目的主页位于。 LGI经过测试,并与标准Lua 5.1,Lua 5.2,...
GObject自省1.主界面这是Gobject FFI。 用法示例: (defvar *gtk* (gir:require-namespace " Gtk " ))(gir:invoke (*gtk* 'init ) nil)( let ((window (gir:invoke (*gtk* " Window " 'new ) (gir:nget *gtk* " ...
离线安装包,亲测可用
离线安装包,亲测可用
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
离线安装包,亲测可用