0

当用户尝试将 int 添加到 nsmutablearray 时,我想发出警告消息

基本上任何包含非 nsstring / nsnumber 值的插入语句都会导致运行时崩溃。当您键入 %@ 而不是 %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];

当我称之为 [self test:@"str",2,nil];

抛出错误信息。

4

1 回答 1

0

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

于 2011-01-13T05:47:12.323 回答