0

NSStreamDelegate 在以前的操作系统中被定义为 (NSObject)NSStreamDelegate 在最新的操作系统中它被定义为 id

两者具有相同的功能。

如果我想编写运行时系统感知的代码。如何创建一个既是又不是的对象?我梦想着那个真正通用的应用程序。

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

我有 myHandlerClass 在新操作系统中是 MyClass:NSObject

因此我的困境。

有什么建议么?

-一种

4

1 回答 1

0

你真的很难让它在两个版本上工作吗?两种思路基本一致。

您肯定必须将您的委托类声明为实现 NSStreamDelegate 协议(在当前 SDK 中,这是一种正式协议,而不是非正式协议):

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

由于“id”类型实际上只是指向 Obj-C 对象的指针的 typedef,因此指向委托类的指针既是 id 也是 NSObject:

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

...应该适用于两个 SDK。或者,如果您在委托类(一个常见的习惯用法)中创建流,您可以这样做:

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

到同样幸福的结局。

于 2010-08-03T05:29:47.803 回答