Ios 提高setValueForKeyPath的鲁棒性

Ios 提高setValueForKeyPath的鲁棒性,ios,cocoa-touch,key-value-coding,defensive-programming,Ios,Cocoa Touch,Key Value Coding,Defensive Programming,我已经创建了NSObject的扩展,允许从PLIST或dictionary中包含的数据设置对象属性。我确实使用了setValuesForKeysWithDictionary,但这只适用于键,而不适用于键路径。我的扩展也做同样的事情,只是允许PLIST包含键路径和键。例如,detailTextLabel.text@“detailed text”作为键值对 这很好,除了可能因为PLIST中的一个输入错误而导致应用程序崩溃。例如,如果属性名存在,但与预期的类型不同(例如,数字而不是字符串),则它将崩溃

我已经创建了NSObject的扩展,允许从PLIST或dictionary中包含的数据设置对象属性。我确实使用了
setValuesForKeysWithDictionary
,但这只适用于键,而不适用于键路径。我的扩展也做同样的事情,只是允许PLIST包含键路径和键。例如,detailTextLabel.text@“detailed text”作为键值对

这很好,除了可能因为PLIST中的一个输入错误而导致应用程序崩溃。例如,如果属性名存在,但与预期的类型不同(例如,数字而不是字符串),则它将崩溃。为了避免这些类型的错误,最好的方法是什么

我已经在我的对象中使用
-(void)setValue:(id)value for undeinedkey:(NSString*)key{}
来捕获PLIST中与实际键不对应的项

#pragma mark -
#pragma mark Extensions to NSObject

@implementation NSObject (SCLibrary)

- (void) setValuesForKeyPathsWithDictionary:(NSDictionary *) keyPathValues {
    NSArray *keys;
    int i, count;
    id key, value;

    keys = [keyPathValues allKeys];
    count = [keys count];
    for (i = 0; i < count; i++)
    {
        key = [keys objectAtIndex: i];
        value = [keyPathValues objectForKey: key];

        [self setValue:value forKeyPath:key];
    }
}
#pragma标记-
#NSObject的pragma标记扩展
@实现NSObject(SCLibrary)
-(void)setValuesForKeyPathsWithDictionary:(NSDictionary*)keyPathValues{
NSArray*钥匙;
int i,计数;
id键,值;
keys=[keyPathValues allKeys];
计数=[键计数];
对于(i=0;i

提前谢谢你,Dave。

setValue:forKeyPath:
周围添加了一个常规的
@try/@catch

@try {
    [self setValue:value forKeyPath:key];
}
@catch (NSException * e) {
    NSLog(@"%@",e);
}
这确实可以防止应用程序崩溃,但我希望找到一种方法,在尝试设置其值之前检查选择器


如果没有更好的答案,将接受此答案。

设置值:forKeyPath:
周围添加了一个常规的
@try/@catch

@try {
    [self setValue:value forKeyPath:key];
}
@catch (NSException * e) {
    NSLog(@"%@",e);
}
这确实可以防止应用程序崩溃,但我希望找到一种方法,在尝试设置其值之前检查选择器

如果没有更好的答案,我们将接受这个答案