Skip to main content
 首页 » 编程设计

iphone之用于将整数添加到nsmuatablearray FMDB/EGODB的编译器指令防御性编程

2026年05月17日80开发

当用户尝试向nsmutablearray添加int时,我想抛出一条警告消息

基本上,任何包含非nsstring / nsnumber值的插入语句都会导致运行时崩溃。当您键入%@而不是%d NSLog(int)时,将发生与您完全相同的崩溃。
崩溃是可以的,但是我想向用户抛出友好的“致命”消息。

到目前为止,我已经尝试过使用isKindOfClass NSObject进行捕获,但是ints正在通过。

#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];

抛出错误信息。

请您参考如下方法:

使用isKindOfClass来测试它是否为NSObject无效。崩溃的原因是它将int视为指向对象的指针,但它是无效的指针。调用isKindOfClass会导致相同的错误。由于应用程序因无效指针而崩溃,因此不会引发任何异常,因此@ try- @ catch语句也不会捕获该异常。基本上,您必须相信用户会侦听编译器,而不在期望对象的地方使用int。