Ios 提高setValueForKeyPath的鲁棒性
我已经创建了NSObject的扩展,允许从PLIST或dictionary中包含的数据设置对象属性。我确实使用了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中的一个输入错误而导致应用程序崩溃。例如,如果属性名存在,但与预期的类型不同(例如,数字而不是字符串),则它将崩溃
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);
}
这确实可以防止应用程序崩溃,但我希望找到一种方法,在尝试设置其值之前检查选择器
如果没有更好的答案,我们将接受这个答案