gpt4 book ai didi

objective-c - 如何检查 id 是实例还是类?

转载 作者:行者123 更新时间:2023-12-03 16:28:26 26 4
gpt4 key购买 nike

假设我有一个方法:

- (void)method:(id)anObject
{
// do something
}

我们都知道 Objective-C 类或对象。所以我一直想知道如何确定 id 在方法内部传递的是类的实例还是类本身?因为它可以这样使用:

[object method:[NSObject new]];

或者:

[object method:[NSObject class]];

我怎样才能知道传递的参数是一个实例?我无法仅通过发送 class 消息来检查它,因为对于类,它将返回与实例相同的结果

已编辑

Alexander 提供的方法不适合我,因为我不知道将通过哪个类别,因此我无法检查特定类别的成员资格。我只需要知道它是一个类(无论什么类)还是一个实例(无论什么类)

最佳答案

类从class消息中返回self,实例返回它们的类。因此,只需测试 class 的结果是否与接收者相同:

- (void)method:(id)anObject
{
if (anObject == [anObject class]) {
// it's a class
} else {
// it's an instance
}
}

编辑:虽然简单,但上面的代码有两个微妙的问题:

  1. 接收者必须实现。所有 NSObject (和 NSProxy)派生类都会这样做,但对于自定义根类,情况可能并非如此。极为罕见。

  2. 如果类返回self,则代码将会中断。正在观察的对象类 (KVO) 可能就是这种情况。并不罕见。

下面的代码始终有效并且不受这些问题的影响:

#import <objc/runtime.h>

- (void)method:(id)anObject
{
if (class_isMetaClass(object_getClass(obj))) {
// it's a class
} else {
// it's an instance
}
}

关于objective-c - 如何检查 id 是实例还是类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28473258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com