От Joshua Bloch, самого Гуру Java в Эффективном Java 2-й выпуск:
"Объект 69: Предпочтите, чтобы утилиты параллелизма ожидали и уведомили".
Вот альтернативный подход, который также может помочь. Предположим, у вас есть NSString *
, который содержит ваш IP-адрес, называемый ipAddressStr
, в формате abcd :
int ipQuads[4];
const char *ipAddress = [ipAddressStr cStringUsingEncoding:NSUTF8StringEncoding];
sscanf(ipAddress, "%d.%d.%d.%d", &ipQuads[0], &ipQuads[1], &ipQuads[2], &ipQuads[3]);
@try {
for (int quad = 0; quad < 4; quad++) {
if ((ipQuads[quad] < 0) || (ipQuads[quad] > 255)) {
NSException *ipException = [NSException
exceptionWithName:@"IPNotFormattedCorrectly"
reason:@"IP range is invalid"
userInfo:nil];
@throw ipException;
}
}
}
@catch (NSException *exc) {
NSLog(@"ERROR: %@", [exc reason]);
}
Вы можете изменить , если
условный блок для выполнения рекомендаций RFC 1918 , если вам нужен такой уровень проверки.
Уловку, которую вы можете сделать, это проверить возврат BSD-вызова inet_aton следующим образом:
#include <arpa/inet.h>
- (BOOL)isIp:(NSString*)string{
struct in_addr pin;
int success = inet_aton([string UTF8String],&pin);
if (success == 1) return TRUE;
return FALSE;
}
Имейте в виду, однако, что это проверяет строку, если она содержит IP-адрес в любом формате, он не ограничивается форматом с точками.