2013-06-07 12 views
5

ho ottenuto questo errore:Auto sintesi proprietà non sarà sintetizzare proprietà dichiarata in un protocollo anche se la sua implementato

/business/Dropbox/badgers/BadgerNew/BGProfileView.m:56:17: Auto property synthesis will not synthesize property declared in a protocol 

Sono consapevole del fatto che la sintesi di proprietà di auto non sintetizzerà proprietà dichiarata in un protocollo

Così Sintetizzo questo me stesso.

Questo è il protocollo:

@protocol BGIhaveNavigationController <NSObject> 

@property (readonly)UINavigationController * navigationController;//This is the problematic property 

@end 

@protocol BGCommonProtocol <NSObject> 


@end 

Per quanto riguarda l'attuazione

@interface BGProfileView : UIViewController 

@end 

è un UIViewController e come sappiamo UIViewController ha una proprietà navigationController. Quindi cosa c'è che non va?

Le cose diventano problematici quando uso questo:

@interface BGProfileView() <BGReviewsTableDelegateProtocol> 

protocollo BGReviewsTableDelegateProtocol eredita BGIhaveNavigationController protocollo

posso rimuovere l'avviso con l'aggiunta di:

-(UINavigationController *) navigationController 
{ 
    return self.navigationController; 
} 

Ma questo è assurdo. In un certo senso

-(UINavigationController *) navigationController 
    { 
     return self.navigationController; 
    } 

-(UINavigationController *) navigationController esiste già attraverso UINavigationController

+1

Prova @dynamic navigationController; – Wain

+0

funziona. Ma perché? navigationController non è lì. –

+2

Stai utilizzando un protocollo per sostituire un metodo su una classe esistente. Questa non è mai una buona idea. @dynamic funziona perché promette che ci sarà un'implementazione lì in fase di runtime, ma se tutto ciò che è conforme a questo protocollo è un controller di visualizzazione, perché il protocollo ha bisogno della proprietà navigationController? – jrturton

risposta

10

Usa

@dynamic navigationController; 

Questo dice al compilatore che l'implementazione proprietà è 'da qualche altra parte' e che dovrebbe fidarsi che il requisito sarà adempiuto in fase di esecuzione. In pratica, ciò significa che è nella superclasse.

Se si tenta di implementarlo da soli, si avrà una memoria doppia (quindi le cose probabilmente non funzioneranno come previsto) o la ricorsione.

+1

NON funziona in Xcode6 – Jacky

+0

sembra funzionare in 6.3.1 –

+0

Funziona anche in 6.4 –