2010-08-03 17 views
0

NSStreamDelegate a été défini dans les précédents OS comme (NSObject) NSStreamDelegate Dans le dernier système d'exploitation, il est défini comme idL'utilisation d'une ancienne catégorie de système d'exploitation et un nouveau système d'exploitation protocole informel dans la même base de code

Les deux ont la même fonction.

Si je veux écrire du code compatible avec le système d'exécution. Comment créer un objet qui est à la fois ni l'un ni l'autre? Je rêve de cette application vraiment universelle.

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

Je myHandlerClass qui, dans l'os NEW est MyClass: NSObject

Ainsi mon dilemme.

Des suggestions?

-A

Répondre

0

Avez-vous fait du mal à obtenir que cela fonctionne sur les deux versions? Les deux idées sont fondamentalement les mêmes.

Vous aurez certainement à déclarer votre classe de délégué en mettant en œuvre le protocole NSStreamDelegate (qui est un protocole formel, pas informel, dans le SDK actuel):

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

Comme le type « id » est vraiment juste un typedef pour un pointeur vers un objet Obj-C, votre pointeur à votre classe de délégué à la fois être un identifiant ainsi qu'un NSObject:

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

... devraient travailler sur les deux SDKs. Ou, si vous créez votre flux à l'intérieur de votre classe de délégué (un idiome commun) que vous feriez:

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

à la même fin heureuse.