Objective-C的内省(Introspection)用法小结

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

恰当地使用内省可以使面向对象的程序运行更加高效和强壮。也有助于避免错误地进行消息派发、错误地假设对象相等。

下面的部分举例介绍如何在代码中有效地使用NSObject的内省方法。
 
1、isKindOfClass:Class

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

2、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;
}
(0)

相关推荐

  • Objective-C封装字符串存储操作示例

    Objective-C简单封装 字符串的存储操作,省去中间沙盒处理方式 复制代码 代码如下: /存储publickey和sessionID -- writeContent: nil - 仅取出数据, 其他 - 修改原内容并提取+(NSString *)storeFile:(NSString *)fileName content:(NSString *)writeContent{    NSString *pathDocuments=[NSSearchPathForDirectoriesInDom

  • 在Swift中使用Objective-C编写类、继承Objective-C类

    互用性(互操作性)使开发者可以定义融合了 Objective-C 语言特性的Swift类.编写 Swift 类时,不仅可以继承 Objective-C 语言编写的父类,采用 Objective-C 的协议,还可以利用 Objective-C 的一些其它功能.这意味着,开发者可以基于 Objective-C 中已有的熟悉.可靠的类.方法和框架来创建 Swift 类,并结合 Swift 提供的现代化和更有效的语言特点对其进行优化. 继承Objective-C的类 在 Swift 中,开发者可以定义一

  • Objective-c代码如何移植为Swift代码 Objective-c代码转移到Swift过程介绍

    迁移工作正好提供了一个重新审视现有 Objective-C 应用程序的机会,也可以通过 Swift 代码来更好的优化应用程序的体系架构,逻辑以及性能.直接的说,你将用先前学到的 mix and match 以及这两个语言间的互操作性来进行增量迁移工作.Mix-and-match 功能使得选择哪些特性和功能来用 Swift 来实现,哪些依然用 Objective-C 来实现变得简单.Swift 和 Objective-C 的互用性又使得将这些功能集成到 Objective-C 变得并不困难.通过这

  • Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect实例分析

    本文以实例详细描述了Objective-C中常用的结构体NSRange,NSPoint,NSSize(CGSize),NSRect的定义及用法,具体如下所示: 1.NSRange: NSRange的原型为 typedef struct _NSRange { NSUInteger location; NSUInteger length; } NSRange; NSMakeRange的函数: NS_INLINEz是内联函数 typedef NSRange *NSRangePointer; NS_IN

  • Swift调用Objective-C编写的API实例

    互用性是让 Swift 和 Objective-C 相接合的一种特性,使你能够在一种语言编写的文件中使用另一种语言.当你准备开始把 Swift 融入到你的开发流程中时,你应该懂得如何利用互用性来重新定义并提高你写 Cocoa 应用的方案. 互用性很重要的一点就是允许你在写 Swift 代码时使用 Objective-C 的 API 接口.当你导入一个 Objective-C 框架后,你可以使用原生的 Swift 语法实例化它的 Class 并且与之交互. 初始化 为了使用 Swift 实例化 O

  • objective-c中生成随机数的方法

    本文简述objective-c中生成随机数的几种常见的方法,分享给大家,希望能给大家带来一点借鉴价值.具体如下: 1).arc4random()方法:比较精确不需要生成随即种子 使用方法如下 : 通过arc4random() 获取0到x-1之间的整数的代码如下: int value = arc4random() % x; 获取1到x之间的整数的代码如下: int value = (arc4random() % x) + 1; 2).CCRANDOM_0_1()方法:在cocos2d中使用 ,范围

  • 在一个项目中同时使用Swift和Objective-C代码混合编程的方法

    Swift 与 Objective-C 的兼容能力使你可以在同一个工程中同时使用两种语言.你可以用这种叫做 mix and match 的特性来开发基于混合语言的应用,可以用 Swfit 的最新特性实现应用的一部分功能,并无缝地并入已有的 Objective-C 的代码中. Mix and Match 概述 Objective-C 和 Swift 文件可以在一个工程中并存,不管这个工程原本是基于 Objective-C 还是 Swift.你可以直接往现有工程中简单地添加另一种语言的源文件.这种自

  • Swift、Objective-C、Cocoa混合编程设置指南

    Swift 被设计用来无缝兼容 Cocoa 和 Objective-C .在 Swift 中,你可以使用 Objective-C 的 API(包括系统框架和你自定义的代码),你也可以在 Objective-C中 使用 Swift 的 API.这种兼容性使 Swift 变成了一个简单.方便并且强大的工具集成到你的 Cocoa 应用开发工作流程中. 这篇指南包括了三个有关兼容性的重要方面方便你更好地利用来开发 Cocoa 应用: 互用性 使你将 Swift 和 Objective-C 相接合,允许在

  • Objective-C 消息传递机制详解

    Objective-C语言中方法的传递有二种:①Selector ② Blocks,本文主要说一下Selector,关于Blocks会在后续总结一下. 消息传递模型(Message Passing)是Objective-C语言的核心机制.在Objective-C中,没有方法调用这种说法,只有消息传递. 在C++或Java中调用某个类的方法,在Objective-C中是给该类发送一个消息.在C++或Java里,类与类的行为方法之间的关系非常紧密,一个方法必定属于一个类,且于编译时就已经绑定在一起,

  • Objective-C的内省(Introspection)用法小结

    内省(Introspection)是面向对象语言和环境的一个强大特性,Objective-C和Cocoa在这个方面的表现尤其的优秀.内省是对象揭示自己作为一个运行时对象的详细信息的一种能力.这些详细信息包括对象在继承树上的位置,对象是否遵循特定的协议,以及是否可以响应特定的消息等等.NSObject协议和类定义了很多内省方法,用于查询运行时信息,以便根据对象的特征进行识别. 恰当地使用内省可以使面向对象的程序运行更加高效和强壮.也有助于避免错误地进行消息派发.错误地假设对象相等. 下面的部分举例

  • Java中String.split()用法小结

    在java.lang包中有String.split()方法,返回是一个数组 我在应用中用到一些,给大家总结一下,仅供大家参考: 1.如果用"."作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用String.split("."); 2.如果用"|"作为分隔的话,必须是如下写法,String.split("\\|"),这样才能正确的分隔开,不能用String.s

  • mybatis 中 foreach collection的用法小结(三种)

    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合. foreach元素的属性主要有 item,index,collection,open,separator,close. item表示集合中每一个元素进行迭代时的别名,     index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,     open表示该语句以什么开始,     separator表示在每次进行迭代之间以什么符号作为分隔 符,     close表示以什么结束. 在使用foreach的时候

  • JS产生随机数的用法小结

    代码如下所述: <script> function GetRandomNum(Min,Max) { var Range = Max - Min; var Rand = Math.random(); return(Min + Math.round(Rand * Range)); } var num = GetRandomNum(1,10); alert(num); </script> var chars = ['0','1','2','3','4','5','6','7','8','

  • 详解PHP中cookie和session的区别及cookie和session用法小结

    具体来说 cookie 是保存在"客户端"的,而session是保存在"服务端"的 cookie 是通过扩展http协议实现的 cookie 主要包括 :名字,值,过期时间,路径和域: 如果cookie不设置生命周期,则以浏览器关闭而关闭,这种cookie一般存储在内存而不是硬盘上.若设置了生命周期则相反,不随浏览器的关闭而消失,这些cookie仍然有效直到超过设定的过 期 时间. session 一种类似散列表的形式保存信息, 当程序需要为某个客户端的请求创建一个

  • MySql数据库中Select用法小结

    一.条件筛选 1.数字筛选:sql = "Select * from [sheet1$] Where 销售单价 > 100" 2.字符条件:sql = "Select * from [sheet1$] Where 物品名称 ='挡泥板'" 3.日期条件:sql = "Select * from [sheet1$] Where 物品名称 ='挡泥板'" 4.区间条件:sql = "Select * from [sheet1$] Wh

  • javaScript产生随机数的用法小结

    var chars = ['0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']; function generateMixed(n) { var res = ""; for(var i = 0; i < n ; i ++) { var id = M

  • C/C++ 中const关键字的用法小结

    C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性. Const作用 NO. 作用 说明 参考 1 可以定义const常量 const int Max = 100; 2 便于进行类型检查 const常量有数据类型,而宏常量没有数据类型.编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误 void f(const int i) { ---} //对传入的参数进行类型检查,不匹配进行提示 3 可以保护被修

  • 基于BigDecimal.setScale的用法小结

    1. BigDecimal num1 = new BigDecimal(2.225667);//这种写法不允许,会造成精度损失 2. BigDecimal num2 = new BigDecimal(2);//这种写法是可以的 3. BigDecimal num = new BigDecimal("2.225667");//一般都会这样写最好 4. int count = num.scale(); System.out.println(count);//6 返回的是小数点后位数 好了,

  • C++语言中std::array的用法小结(神器用法)

    摘要:在这篇文章里,将从各个角度介绍下std::array的用法,希望能带来一些启发. td::array是在C++11标准中增加的STL容器,它的设计目的是提供与原生数组类似的功能与性能.也正因此,使得std::array有很多与其他容器不同的特殊之处,比如:std::array的元素是直接存放在实例内部,而不是在堆上分配空间:std::array的大小必须在编译期确定:std::array的构造函数.析构函数和赋值操作符都是编译器隐式声明的--这让很多用惯了std::vector这类容器的程

随机推荐