Johnykutty
Johnykutty

Reputation: 12859

How to get classname in objective c Like 'NSString'

I want to get the class name of an object as what we are using. That means now if I write this code

 NSString *s = [NSString string];
 NSLog(@"%@",[s class]);

The output is __NSCFConstantString

How can I get it as NSString itself ?

Note : NSString is just an example

I know __NSCFConstantString is correct. But my intention is to get like NSString. Is there any way to acheive this?

Upvotes: 0

Views: 3330

Answers (3)

Mick MacCallum
Mick MacCallum

Reputation: 130222

Give these a try, they'll output NSString. Keep in mind, the second set requires importing the Objective-C runtime header.

#import <objc/runtime.h>

NSString *string = @"I'm a string.";


NSLog(@"%@",NSStringFromClass([string classForCoder]));
NSLog(@"%@",NSStringFromClass([string classForKeyedArchiver]));

NSLog(@"%s",class_getName([string classForCoder]));
NSLog(@"%s",class_getName([string classForKeyedArchiver]));

Now, this won't work in all cases. For example, trying to get the class of NSConstantString, in this manner will output NSString. If you require checking the class name as a string in this way, you probably should reconsider your approach to solving the problem.

Upvotes: 9

Martin R
Martin R

Reputation: 540075

NSString is a so-called "class cluster". That means that the init methods will return an instance of some subclass (such as __NSCFConstantString or __NSCFString). You will never get an instance with the class equal to NSString.

If your intention is to check whether an object is a NSString or not then use isKindOfClass:

if ([s isKindOfClass:[NSString class]]) {
    // this is a string …
}

Other examples of class clusters are NSNumber, NSDictionary, NSArray and their mutable variants.

Upvotes: 3

Sulthan
Sulthan

Reputation: 130191

NSLog(@"%@", NSStringFromClass([s class]));

Upvotes: 2

Related Questions