12

我创建了一个自定义对象,其中定义了 3 个属性。我创建对象并将值分配给这些属性。之后,我将该对象放入NSMutable Array. 我知道我可以使用:

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

告诉我数组中有哪些类型的对象。但我想更深入地了解每个对象的属性。我只是不确定如何针对他们。

这是我正在使用的代码: Person 是我的自定义对象。

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);
4

4 回答 4

14

您必须使用descriptionPerson 类中的方法

-(NSString *)description{

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

这样,您可以始终打印您内部的对象,NSArray而不是内存描述,您将返回您之前在特定对象的描述方法中定义的值。

如果您只想NSArray使用 use 占位符中的元素执行此操作:

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

两者之间没有太大区别,但它更有用,因为一旦创建了描述方法,您就不必重写它,只需打印对象即可。

于 2013-10-13T00:03:23.757 回答
6

有一种比在所有类中使用描述方法更简单的方法。

使用 ICHObjectPrinter:

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

https://github.com/arundevma/ICHObjectPrinter

于 2014-07-07T17:50:04.077 回答
2

要打印一个对象的所有属性,请使用以下代码:

- (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(@"-----------------------------------------------");
}
于 2016-09-11T16:18:38.697 回答
1

如需更高级的解决方案,请查看此答案https://stackoverflow.com/a/2304797/519280。您可以将此代码添加到您的 Person 对象扩展的基类中,然后您可以使用 autoDescribe 函数自动打印出您的对象的所有属性,而无需通过手动列出所有属性的过程描述方法。

于 2013-10-15T16:14:00.780 回答