NSStreamDelegate在以前的操作系统中被定义为(NSObject)NSStreamDelegate 在最新的操作系统中,它被定义为id
两者都具有相同的功能。
如果我想编写运行时系统感知的代码。如何创建既可以同时使用的对象呢?我梦想着这个真正的通用应用程序。
if(catchOS10.5_or_iOS3.2){ [MyStream setDelegate:myObj] } else { [MyStream setDelegate:myObjWithProtocol] }
我在新操作系统中有myHandlerClass MyClass:NSObject
因此我的困惑。
有什么建议吗?
-A
答案 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;
同样幸福的结局。