What are the situations in which you would use the __IPHONE_OS_VERSION_MAX_ALLOWED check? What about __IPHONE_OS_VERSION_MIN_REQUIRED?
a practical implementation/example of using instancesRespondToSelector:, expanding on @Nick Lockwood's anwser:
+(BOOL) testIsHeaderInConnectData:(NSData *) connectData {
static NSString *headString = nil;
static NSData *headData = nil;
static BOOL rangeCheckOk = NO;
static BOOL rangeCheckTestComplete = NO;
if (!rangeCheckTestComplete) {
rangeCheckOk = [NSData instancesRespondToSelector:@selector(rangeOfData:options:range:)];
headString = @"HEAD ";
headData = (rangeCheckOk?[[NSData alloc] initWithBytes:headString.UTF8String length:headString.length]:nil);
headString = (rangeCheckOk?nil:[[NSString alloc ]initWithString:headString]);
rangeCheckTestComplete = YES;
}
NSInteger testLength = connectData.length;
BOOL isHeader = testLength > 5;
if (isHeader) {
testLength = (testLength < 128?testLength:128);
if (rangeCheckOk) {
isHeader = [connectData rangeOfData:headData options:0 range:(NSRange){0,testLength}].location!=NSNotFound;
} else {
NSString *headStart = [[NSString alloc] initWithBytes:connectData.bytes length:testLength encoding:NSUTF8StringEncoding];
isHeader = [headStart rangeOfString:headString].location!=NSNotFound;
[headStart release];
}
}
return isHeader;
}