在相同的代码库中使用旧的OS类别和新的OS非正式协议

时间:2010-08-03 04:53:00

标签: iphone objective-c ipad universal

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

两者都具有相同的功能。

如果我想编写运行时系统感知的代码。如何创建既可以同时使用的对象呢?我梦想着这个真正的通用应用程序。

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

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

因此我的困惑。

有什么建议吗?

-A

1 个答案:

答案 0 :(得分: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;

同样幸福的结局。