директива компилятора для защитного программирования для добавления целых чисел в массив nsmuatablearray / EGODB - PullRequest
0 голосов
/ 13 января 2011

Я хотел бы выдать предупреждающее сообщение, когда пользователи пытаются добавить 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];

, когда я вызываю это [самопроверка: @ "str", 2, nil];

выдает сообщение об ошибке.

1 Ответ

0 голосов
/ 13 января 2011

Использование isKindOfClass для проверки, является ли это NSObject, не будет работать. Причина сбоя заключается в том, что он рассматривает int как указатель на объект, но это недопустимый указатель. Вызов isKindOfClass вызовет ту же ошибку. Поскольку приложение аварийно завершает работу из-за неверного указателя, исключение не выдается, поэтому оператор @ try- @ catch также не будет его перехватывать. По сути, вы должны верить, что пользователь будет слушать компилятор и не будет использовать int там, где ожидается объект.

...