2012-02-07 15 views
8
@protocol protoA <NSObject> 
@end 

@interface objA : NSObject<protoA> { 
    @private 
    } 
@end 

@implementation objA 
@end 

@protocol protoB <NSObject> 
    -(void) foo: (id <protoA> *) par; 
@end 

@interface objB : NSObject<protoB> 
    -(void) foo: (id <protoA> *) par; 
@end 

@implementation objB 
    -(void) foo: (id <protoA> *) par 
    { 
    //... 
    } 
@end 

en algún otro método de la clase i usarlo de esta manera:pasando puntero de objeto como puntero protocolo

objB *obj1 = [[objB alloc] init]; 
objA *obj2 = [[objA alloc] init]; 

[obj1 foo: obj2]; 

tengo error del compilador: "conversión implícita de un puntero de Objective-C a '__autoreleasing ID *' no está permitido con ARC

¿Cuál es la forma correcta de hacer llegar esta funcionalidad?

Respuesta

13

id ya es un tipo de puntero, utilice solo o en lugar id<Protocol> f id<Protocol>*.

+0

eso era todo. Gracias – gossamer

+0

¡ESO ES! Esta solución me salvó un dolor de cabeza XD –

4

id es un puntero ya, la caída *:

-(void) foo: (id <protoA>) par 
2

Si desea especificar el tipo y el protocolo, se puede utilizar este formulario:

- (void)method:(MONType<MONProtocol>*)param; 

Si desea un tipo objc opaco (id) y protocolo, utilice este formulario:

- (void)method:(id<MONProtocol>)param;