Использование старой категории ОС и неформального протокола новой ОС в одной и той же кодовой базе - PullRequest
0 голосов
/ 03 августа 2010

NSStreamDelegate был определен в предыдущей ОС как (NSObject) NSStreamDelegate В последней ОС это определяется как id

Оба имеют одинаковую функцию.

Если я хочу написать код, который поддерживает систему времени выполнения. Как мне создать объект, который есть и то и другое? Я мечтаю об этом действительно универсальном приложении.

if (catchOS10.5_or_iOS3.2) { [MyStream setDelegate: myObj] } еще { [MyStream setDelegate: myObjWithProtocol] }

У меня есть myHandlerClass, который в NEW OS MyClass: NSObject

Таким образом, мое затруднение.

Есть предложения?

-A

1 Ответ

0 голосов
/ 03 августа 2010

У вас действительно есть проблемы, чтобы заставить это работать на обеих версиях? Две идеи в основном одинаковы.

Вам определенно придется объявить свой класс делегата как реализующий протокол NSStreamDelegate (который является формальным, а не неофициальным протоколом в текущем SDK):

@interface MyHandlerClass : NSObject <NSStreamDelegate> {
    // ...
}
-(void)stream:(NSStream*)theStream handleEvent:(NSStreamEvent)streamEvent;
@end

Так как тип "id" действительно является просто typedef для указателя на объект Obj-C, ваш указатель на ваш класс делегата будет как id, так и NSObject:

NSStream *myStream = [[NSStream alloc] init];
MyHandlerClass *del = [[MyHandlerClass alloc] init];
myStream.delegate = del;

... должен работать на обоих SDK. Или, если вы создаете свой поток внутри вашего класса делегата (обычная идиома), вы должны сделать:

NSStream *myStream = [[NSStream alloc] init];
myStream.delegate = self;

к тому же счастливому концу.

...