Как условно использовать новый API Какао - PullRequest
4 голосов
/ 18 ноября 2009

В 10.6 Apple добавила +[NSPropertyListSerialization dataWithPropertyList:format:options:error:] и пометила более старый +[NSPropertyListSerialization dataFromPropertyList:format:errorDescription:] как устаревший и вскоре устаревший. Один из способов использовать более новый вызов на 10.6 и выше и все же работать на более ранних выпусках ОС, будет выглядеть примерно так:

if ([NSPropertyListSerialization respondsToSelector:@selector(dataWithPropertyList:format:options:error:)]) {
    data = [NSPropertyListSerialization dataWithPropertyList:dict
                                                      format:NSPropertyListXMLFormat_v1_0
                                                     options:0
                                                       error:&err];
} else {
    data = [NSPropertyListSerialization dataFromPropertyList:dict
                                                      format:NSPropertyListXMLFormat_v1_0
                                            errorDescription:&errorDescription];        
}

Созданный на основе 10.4 SDK (для совместимости с этим выпуском), это приводит к: warning: 'NSPropertyListSerialization' may not respond to '+dataWithPropertyList:format:options:error:' И, что еще хуже, поскольку компилятор не знает об этом селекторе, он может неправильно передавать аргументы.

Является ли NSInvocation одобренным / наилучшим способом вызова новых API, которые, с точки зрения SDK, еще не существуют?

Ответы [ 2 ]

6 голосов
/ 18 ноября 2009

IIRC, вы хотите использовать 10.6 SDK и установить цель развертывания (MACOSX_DEPLOYMENT_TARGET) на 10.4, чтобы символы 10.5 / 10.6 были слабо связаны. Тогда вы можете использовать respondsToSelector: и не получать предупреждения.

Убедитесь, что вы проверяете, что объект может реагировать на селектор, конечно, или вы потерпите крах 10.4 / 10.5.

2 голосов
/ 18 ноября 2009

Еще один способ сделать это - объявить недостающий метод самостоятельно как категорию рассматриваемого класса. Это заставит компилятор перестать жаловаться на то, что он не нашел метод, хотя, конечно, вам все равно понадобится проверка времени выполнения, которую вы уже делаете, чтобы избежать фактического вызова метода. Вы можете также захотеть обернуть такое объявление с помощью макросов доступности, чтобы оно было проигнорировано, как только вы перейдете к использованию 10.5 / 10.6 SDK, и вы не получите другую жалобу компилятора. Это будет выглядеть примерно так:

#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_4 //ignore when compiling with the 10.5 SDK or higher
@interface NSPropertyListSerialization(MissingMethods)

+ (NSData *)dataWithPropertyList:(id)plist format:(NSPropertyListFormat)format options:(NSPropertyListWriteOptions)opt error:(NSError **)error;

@end
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...