编译器指令防御性编程,用于向nsmuatablearray FMDB / EGODB添加整数

时间:2011-01-13 05:38:23

标签: iphone crash compiler-directives

当用户尝试将int添加到nsmutablearray

时,我想抛出一条警告消息

基本上任何包含非nsstring / nsnumber值的insert语句都会导致运行时崩溃。当你输入%@而不是%d NSLog(int)时,你得到的崩溃完全相同; 崩溃是可以的,但我想向用户抛出一个友好的'致命'消息。

到目前为止,我已尝试使用isKindOfClass NSObject进行捕获但是整数正在下滑。

#define FATAL_MSG "FATAL: object is not an NSObject subclass. Are you using int? use [NSNumber numberWithInt:1] \n"
#define VAToArray(firstarg) ({\
NSMutableArray* valistArray = [NSMutableArray array];\
id obj = nil;\
va_list arguments;\
va_start(arguments, sql);\
@try { \
while ((obj = va_arg(arguments, id))) {\
if([obj isKindOfClass:[NSObject class]]) [valistArray addObject:obj];\
else printf(FATAL_MSG); \
}\
}   \
@catch(NSException *exception){ \
  printf(FATAL_MSG); \
} \
va_end(arguments);\
valistArray;\
})


- (void)test:(NSString*)sql,... {

NSLog(@“VAToArray:%@”,VAToArray(sql));     }

//然后调用此

[self test:@"str",@"test",nil];

我打电话给你     [自测:@“str”,2,nil];

抛出错误信息。

1 个答案:

答案 0 :(得分:0)

使用isKindOfClass来测试它是否是NSObject不起作用。崩溃的原因是它将int视为指向对象的指针,但它是一个无效的指针。调用isKindOfClass会导致相同的错误。由于应用程序从无效指针崩溃,因此没有抛出异常,因此@ try- @ catch语句也不会捕获它。基本上,您必须相信用户将监听编译器而不使用期望对象的int。