0

NSStreamDelegate は以前の OS では (NSObject)NSStreamDelegate として定義されていましたが、最新の OS では id として定義されています。

どちらも同じ機能です。

ランタイム システムに対応したコードを記述したい場合。両方でどちらでもないオブジェクトを作成するにはどうすればよいですか? 真にユニバーサルなアプリを夢見ています。

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

私は新しいOSで MyClass:NSObject である myHandlerClass を持っています

したがって、私の困惑。

助言がありますか?

-A

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 に答える