首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ObjC: NSValue和NSNumber的区别

ObjC: NSValue和NSNumber的区别
EN

Stack Overflow用户
提问于 2016-09-13 13:26:45
回答 2查看 1.2K关注 0票数 3

我有一些代码,在那里我将接收一个未知类型的对象。它可以是NSStringNSNumber、包装在NSValue或其他类中的标量:

代码语言:javascript
复制
-(void) doSomethingWith:(id) value {
    if ( <test-for-NSValue> ) { 
        // Do something with a NSValue
    } else {
        // Do something else
    }
}

我需要识别NSValue中存在标量类型的位置。

问题是识别NSValue包装的标量与NSNumber。由于NSNumber继承自NSValue,而且两者都是类集群,所以我很难对它们进行分类。

所以:

[value isKindOfClass:[NSValue class]] ...将NSNumbers视为NSValues。

[value isMemberOfClass:[NSValue class]] ...不识别NSValues,因为实例是具体的子类型。

有人知道怎么做吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-13 13:34:23

那麽:

代码语言:javascript
复制
-(void) doSomethingWith:(id) value {
    if ([value isKindOfClass:[NSValue class]] && ![value isKindOfClass:[NSNumber class]]) {
       // NSValue but not instance of NSNumber
    } else {
       ...
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-09-13 14:19:51

首先,我们需要了解iskindofClass和isMemberOfClass之间的差异。

isKindOfClass

返回一个布尔值,该值指示接收方是给定类的实例还是继承自该类的任何类的实例。 是的,如果接收方是aClass的实例或继承自aClass的任何类的实例,则为否。

isMemberOfClass

返回一个布尔值,该值指示接收方是否是给定类的实例。 是的,如果接收方是aClass的一个实例,则为否。

然后非常重要

NSValue

一个NSValue对象是单个C或object数据项的简单容器。它可以保存任何标量类型,如int、float和char,以及指针、结构和对象id引用。使用该类可以处理集合(如NSArray和NSSet)、键值编码和其他需要目标C对象的API中的此类数据类型。NSValue对象总是不可变的。

NSNumber

NSNumber是NSValue的子类,它提供的值为任何C标量(数值)类型的。它定义了一组方法,专门用于将值设置和访问为有符号或无符号字符、短int、int、长int、长int、float或double或BOOL。(请注意,number对象不一定保留使用它们创建的类型。)它还定义了一个比较:方法来确定两个NSNumber对象的顺序。

代码语言:javascript
复制
if ([value isKindOfClass:[NSValue class]]) //It will return YES because NSNumber value subclass or inherits from NSValue
{
   ..........
}

if ([value isMemberOfClass:[NSValue class]])  //It will return NO because NSNumber value is not a member of the NSValue
{
   ......... 
}

类对象可能是编译器创建的对象,但它们仍然支持成员的概念。因此,可以使用此方法验证接收方是特定的Class对象。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39471308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档