【问题标题】:Using an old OS category and a new OS informal protocol in the same code base在同一代码库中使用旧的 OS 类别和新的 OS 非正式协议
【发布时间】:2010-08-03 13:29:47
【问题描述】:

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

两者功能相同。

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

如果(catchOS10.5_or_iOS3.2){ [MyStream setDelegate:myObj] } 别的 { [MyStream setDelegate:myObjWithProtocol] }

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

这就是我的困惑。

有什么建议吗?

-A

【问题讨论】:

    标签: iphone objective-c ipad universal


    【解决方案1】:

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

    您必须将您的委托类声明为实现 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;
    

    为了同样的幸福结局。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-06
      • 2020-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多