0

ユーザーが int を nsmutablearray に追加しようとしたときに、警告メッセージをスローしたいと思います

基本的に、nsstring / nsnumber ではない値を含む挿入ステートメントは、ランタイム クラッシュを引き起こします。%d NSLog(int); の代わりに %@ を入力したときに発生するクラッシュとまったく同じです。クラッシュは問題ありませんが、わかりやすい「FATAL」メッセージをユーザーに表示したいと考えています。

これまでのところ、isKindOfClass NSObject でこの try catch を使用していますが、int がすり抜けています。

#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 に答える