2011-08-25 12 views
5

Tengo un método que devuelve CGPath y está generando advertencias de analizador. El método se declara en un protocolo. Aquí está un ejemplo de implementación que está generando la advertencia:¿Cómo debo evitar esta advertencia de memoria?

"potenciales de fuga de un objeto asignado en la línea 47 y se almacenan en 'camino'":

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

    return NULL; 
} 

Aquí está el uso de ejemplo que es la generación de la advertencia, "decremento incorrecta de la cuenta de referencia de un objeto que no pertenece a este punto por el que llama"

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

// Use the path to do some drawing 

CGRelease(path); 

Mi gestión de memoria es el correc t; Estoy devolviendo un CGPath retenido de mi método de protocolo y lo estoy liberando en el bloque de llamadas, por lo que sé que las advertencias se pueden ignorar, pero me gustaría eliminarlas por completo.

¿Falto una convención de nomenclatura que hará feliz al analizador? ¿Se pueden definir las funciones en los protocolos? ¿Cómo funcionará la creación de subclases?

+1

¿Podría quizás divulgar la redacción de la advertencia que está recibiendo, o debemos adivinar? –

+0

Mis disculpas. Actualizado. – kubi

+0

¿Qué sucede si cambia el nombre de su método a pathForBounds: key: ?? –

Respuesta

5

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

una nota detallada sobre el tema se puede encontrar here

, alternativamente, se podría haber optado por utilizar el atributo cf_returns_retained, pero es mejor convenciones (OMI) para favorecer la nomenclatura.

+0

Hermoso. Tan obvio en retrospectiva. – kubi

+0

No sé por qué no votó. Esta es absolutamente la respuesta correcta. El analizador está funcionando fuera de las convenciones de nombres de métodos. Cambiar el nombre a "newPathForBounds" le indica al analizador (y a cualquier desarrollador que lo usa) exactamente qué hace este método, y que debe esperar que un objeto retenido salga por el otro extremo. – Steve

+0

Acabo de suponer que los métodos que devuelven los objetos de Foundation tuvieron que usar los convenios de nombres de Foundation. Tampoco sé por qué esto obtuvo un voto negativo. – kubi

Cuestiones relacionadas