从实例中获取类的名称

151

我有以下问题:我得到了一个类的实例并想知道该实例所属类的名称。如何获取这个信息?


可以重新表述您的问题或接受与问题匹配的答案吗? - Jasper Blues
@JasperBlues:完成了,甚至没有意识到它变得如此受欢迎! - Robin
8个回答

413

NSStringFromClass([instance class])可以解决问题。


34
因为回答了问题,让谷歌搜索者可以得到答案,而不是预测需求,所以我点了赞。 - Gleno
2
请记得 #import <objc/objc-runtime.h>,以便在实例上调用类。 - JP Illanes

31

如果你只想测试一个对象是否属于某种类(Class)

BOOL test = [self isKindOfClass:[SomeClass class]];

17

来自类本身内部

-(NSString *) className
{
    return NSStringFromClass([self class]);
}

2
绝对不想激怒您,但这是您个人资料中第二个与iOS相关的答案。在我的看法中,我们只能从实现内部将一个实例称为“self”。您认为这是否会对三年前被接受的答案有实质性的补充和改进? - danh
@danh 我看到你在追捕我。干得好! - Katedral Pillon
抱歉,我刚刚点了这个,一直在考虑是否要说什么。只是想开个玩笑,但我知道在这些半匿名的环境中情绪很容易激动。感谢你对此保持好心态。(事实上,+1 是为了练习封装而加的)。 - danh
2
这只会给答案带来麻烦,没有任何实际作用。 - Nikolai Ruhe
1
应该将这个方法改为类方法。 - Bhumit Muchhadia

5

OBJC:

NSStringFromClass([instance class])

SWIFT

From instance:

String(describing: YourType.self)

从类型:

String(describing: self)

2

你也可以使用[[self class] description]


2

只需添加一个类别:

NSObject+Extensions.h
- (NSString *)className;

NSObject+Extensions.m
- (NSString *)className {
    return NSStringFromClass(self.class);
}

然后使用以下代码:
NSString *className = [[SomeObject new] className];

甚至更多的可能性:
NSString *className = SomeObject.new.className;

要在任何地方使用它,请将该类别添加到YourProject.pch文件中。


如果在 Swift 类上调用,它将返回一个带命名空间的类名。 - Alper

0
如果您正在寻找如何在Swift中获取类名,可以使用反射来获取有关对象的信息。
let tokens = split(reflect(self).summary, { $0 == "." })
if let typeName = tokens.last {
    println(typeName)
}

或者只是self.dynamicType - jbg

0
  • 例如
    • NSString* classNameNSStr = [someObjcInstance className]
  • 对于类
    • NSString* classNameNSStr = NSStringFromClass(someObjcClass)
    • const char* className = object_getClassName(someObjcClass)

--> 相关:

  • 只想比较是否为某个类
    • -> 不需要获取类名,只需要使用isKindOfClass
      • BOOL isSameClass = [someObjcInstance isKindOfClass: SomeClass];
        • SomeClass可以从objc_getClass("SomeClassName")获取

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接