2011-08-25 18 views
5

Ho un metodo che restituisce un CGPath e sta generando avvisi dell'analizzatore. Il metodo è dichiarato in un protocollo. Ecco un esempio di implementazione che genera l'allarme:Come dovrei evitare questo avviso di memoria?

"potenziale perdita di un oggetto allocato sulla linea 47 e memorizzati in 'percorso'":

- (CGPathRef)createPathForBounds:(CGRect)bounds key:(NSString *)key; 
{ 
    if ([key isEqualToString:OvalColumn]) 
    { 
     CGPathRef path = CGPathCreateWithEllipseInRect(bounds, NULL); 
     return path; 
    } 

    return NULL; 
} 

Ecco esempio di utilizzo che è generando l'avvertimento, "decremento non corretta del conteggio dei riferimenti di un oggetto che non è di proprietà, a questo punto da parte del chiamante"

CGPathRef path = [self.delegate createPathForBounds:bounds key:someKey]; 

// Use the path to do some drawing 

CGRelease(path); 

mia gestione della memoria è correc t; Sto restituendo uno CGPath trattenuto dal mio metodo di protocollo e lo sto rilasciando nel blocco chiamante, quindi so che gli avvertimenti possono essere ignorati, ma mi piacerebbe rimuoverli del tutto.

mi manca una convenzione di denominazione che renderà l'analizzatore felice? È possibile definire le funzioni nei protocolli? Come funziona la sottoclasse?

+1

Potrebbe forse rivelare il testo della segnalazione che stai ricevendo, o dobbiamo indovinare? –

+0

Le mie scuse. Aggiornato. – kubi

+0

Cosa succede se si rinomina il metodo su pathForBounds: chiave: ?? –

risposta

5

- (CGPathRef)newPathForBounds:(CGRect)bounds key:(NSString *)key

una nota dettagliata sull'argomento si possono trovare here

In alternativa, si potrebbe avere scelto di utilizzare l'attributo cf_returns_retained, ma è meglio (IMO) per favorire le convenzioni di denominazione.

+0

Bello. Così ovvio col senno di poi. – kubi

+0

Non so perché non sia stato votato. Questa è assolutamente la risposta giusta. L'analizzatore sta lavorando sulle convenzioni di denominazione dei metodi. Cambiando il nome in "newPathForBounds" si dice all'analizzatore (e agli sviluppatori che lo usano) esattamente cosa sta facendo questo metodo - e che dovresti aspettarti che un oggetto mantenuto venga sputato all'altra estremità. – Steve

+0

Ho appena assunto che i metodi che restituiscono gli oggetti Foundation dovevano utilizzare le convenzioni di denominazione della Fondazione. Inoltre, non so perché questo ha avuto un voto negativo. – kubi

Problemi correlati