Asad Khan
Asad Khan

Reputation: 11889

How do I get class information at runtime in Objective-C?

I have NSMutableArray with different objects in it of different classes. Now I want to get the class name, related stuff and also check if the respective object is NSString or not. How should I go about it?

I was trying something like the following. It wasn't working of course.

for(NSString *string in array){
    NSLog(@"Name of the class : %@", [NSString stringWithCString:class_getName(Class id)];

Upvotes: 3

Views: 2623

Answers (3)

harveyswik
harveyswik

Reputation: 19

I have NSMutableArray with different objects in it of different classes. Now I want to get the class name & related stuff & also check if the respective object is NSString or not.

Hold up. Why do have an array of different typed objects in the first place? Could you redo your design to avoid getting into that situation?

As others have said, -isKindOfClass: works. One downside is it generally leads to brittle code. Here your loop needs to know about all the classes that could be in the array. Sometimes this is the best you can do though.

Designs that use -respondsToSelector: tend to be a little more robust. Here your loop would need to know about the behaviors it depends on of classes in the array.

Upvotes: 1

Joost
Joost

Reputation: 10413

for(id object in array){
    NSLog(@"Name of the class: %@", [object className]);
    NSLog(@"Object is a string: %d", [object isKindOfClass:[NSString class]]);
}

Take a look at the NSObject class and protocol for other interesting methods.

Upvotes: 6

If you're on Mac OS X, you can use [object className], it returns an NSString

for(id obj in array) NSLog(@"Name of the class: %@", [obj className]);

To check if it's a NSString, you should use something like this:

for(id obj in array) {
    if ([obj isKindofClass:[NSString class]]) {
        // do something
    }
}

Upvotes: 6

Related Questions