2012-02-07 16 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 

in qualche altro metodo di classe ho usarlo in questo modo:passando puntatore dell'oggetto come puntatore protocollo

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

[obj1 foo: obj2]; 

Ho errore del compilatore: "conversione implicita di un puntatore Objective-C a '__autoreleasing id *' non è consentita con ARC

Qual è il modo corretto di fare ottenere questa funzionalità?

risposta

13

id già è un puntatore di tipo, utilizzare solo id<Protocol> invece o f id<Protocol>*.

+0

che era. Grazie – gossamer

+0

ECCO! Questa soluzione mi ha salvato un mal di testa XD –

4

id è un puntatore già, goccia *:

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

Se si desidera specificare il tipo e il protocollo, è possibile utilizzare questo modulo:

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

Se si desidera un tipo objc opaco (id) e il protocollo, utilizzare questo modulo:

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