自动设置NSString属性的默认值

时间:2015-06-04 03:24:39

标签: ios objective-c nsstring objective-c-runtime

我的代码中有很多bean / data类,我用它们转换为JSON用于网络通信。问题是,如果我的班级中有NSString属性,我想将其默认值设置为空字符串 @“”而不是 nil 。我有一个选项是:Setting Default Values For NSString Properties但我必须编写代码来设置属性值,我不想这样做。

我尝试使用Objc运行时获取所有属性,并做了类似这样的事情:

    unsigned int numberOfProperties = 0;
    objc_property_t *propertyArray = class_copyPropertyList([self class], &numberOfProperties);

    for (NSUInteger i = 0; i < numberOfProperties; i++)
    {
        objc_property_t property = propertyArray[i];
        NSString *name = [NSString stringWithUTF8String:property_getName(property)];
        const char * propAttr = property_getAttributes(property);
        NSString *propString = [NSString stringWithUTF8String:propAttr];
        NSArray *attrArray = [propString componentsSeparatedByString:@"\""];
        if (attrArray.count > 0) {
            NSString *propType = [attrArray objectAtIndex:1];
            if ([propType containsString:@"NSString"]) {
                [self setValue:@"" forKey:name];
            }
        }

    }
    free(propertyArray);

这对我来说就像一个魅力。唯一的问题是我继承了类,这段代码只设置子类的值,它不设置基类中的属性值。我正在使用xcode 6.3.1&amp; iOS 8.x.任何帮助深表感谢。感谢

2 个答案:

答案 0 :(得分:1)

您可以在bean / data基类中定义递归方法Base Ctr Derived Ctr Base Ctr Derived copy Ctr Derived Dtr Base Dtr Derived Dtr Base Dtr ,例如setDefaultPropValuesForClass:,并从基类init方法调用它。请参阅以下实施:

Bean

答案 1 :(得分:0)

你可以通过

检查你的类是否是一个子类

[self class] is SubclassOfClass:然后获取基础或超级类的属性列表的副本。

objc_property_t *propertyArray = class_copyPropertyList([[self class]superclass], &numberOfProperties);