How to Print out(NSLog) the properties of a custom

2019-01-20 07:50发布

问题:

I have a custom object that I create with 3 properties defined in it. I create the object and assign the values to those properties. After that I put that object into an NSMutable Array. I know I can use :

for (id obj in personArray)
{
             NSLog(@"obj: %@", obj);
}
NSLog(@"%@", personArray);

To tell me what kind of objects are in my array. But I want to go a level deeper, I want to be able to see what the properties are for each of those objects. I'm just not sure how to target them.

Here is the code and I am using: Person is my custom object.

personObject = [[Person alloc]init];
[personObject setFirstName:firstName.text];
[personObject setLastName:lastName.text];
[personObject setEmail:emailAddress.text];

// add the person object to the array
// the array was alloc and init in a method above this code.
[personArray addObject:personObject];

for (id obj in personArray)
{
    NSLog(@"obj: %@", obj);
}

NSLog(@"%@", personArray);

回答1:

You have to use the description method inside your Person class

-(NSString *)description{

    return @"FirstName: %@, LastName: %@, E-mail: %@", 
                        _firstName, _lastName, _email;
}

This way you can print always the object you have inside your NSArray but instead of the memory description you'll get returned the values you've defined before in your description method of the specific object.

If you just want to do this with the element from the NSArray use placeholders:

NSLog(@"FirstName: %@, LastName: %@, E-mail: %@", 
                       obj.firstname, obj.lastname, obj.email);

There is not much difference between, but its more useful because you don't have to rewrite it once you have created your description method, you just have to print the object.



回答2:

There is a simple way than using description method in all classes.

Use ICHObjectPrinter:

NSLog(@"Object description is %@",[ICHObjectPrinter descriptionForObject:person]);

https://github.com/arundevma/ICHObjectPrinter



回答3:

For a slightly more advanced solution check out this answer https://stackoverflow.com/a/2304797/519280. You can add this code to a base class that your Person object extends, and from then on you can use the autoDescribe function to automatically print out all the properties of your object without having to go through the process of manually listing all the properties in the describe method.



回答4:

To print all the properties of one object, use followed codes:

- (void) logProperties:(NSObject*)obj {

NSLog(@"----------------------------------------------- Properties for object %@", obj);

    unsigned int numberOfProperties = 0;
    objc_property_t *propertyArray = class_copyPropertyList([obj class], &numberOfProperties);
    for (NSUInteger i = 0; i < numberOfProperties; i++) {
        objc_property_t property = propertyArray[i];
        NSString *name = [[NSString alloc] initWithUTF8String:property_getName(property)];
        NSLog(@"Property %@ Value: %@", name, [self valueForKey:name]);
    }
NSLog(@"-----------------------------------------------");
}