Pregunta

Entiendo que, comenzando con iOS 4, ahora existe la capacidad de no declarar IVARS, y permitir que el compilador los cree automáticamente para usted cuando sintetiza la propiedad. Sin embargo, no puedo encontrar ninguna documentación de Apple en esta característica.

Además, ¿hay alguna documentación sobre las mejores prácticas o las pautas recomendadas por Apple sobre el uso de IVARS y propiedades? Siempre he usado propiedades como esta:

.h archivo

@interface myClass {
    NSIndexPath *_indexPath
}

@property(nonatomic, retain) NSIndexPath *indexPath

@end

archivo .m

@implementation myClass

@synthesize indexPath = _indexPath;

- (void)dealloc {
    [_indexPath release];
}
@end

Utilizo el _indexpath en lugar de indexpath como mi nombre de ivar para asegurarme de que nunca use indexPath Cuando necesito usar self.indexPath. Pero ahora que iOS admite propiedades automáticas, no necesito preocuparme por eso. Sin embargo, si echo de lado la Declaración de Ivar, ¿cómo debo manejar la liberación en mi DealLoc? Me enseñaron a usar IVAR directamente al liberar en DealLoc, en lugar de usar los métodos de propiedad. Si no tengo un IVAR en el tiempo de diseño, ¿puedo llamar al método de propiedad?

¿Fue útil?

Solución

He pasado por muchas formas diferentes de lidiar con esto. Mi método actual es utilizar el acceso a la propiedad en DealLoc. Las razones para no ser demasiado artificiales (en mi opinión) para no hacerlo, excepto en los casos en que sé que la propiedad tiene un comportamiento extraño.

@interface Class
@property (nonatomic, retain) id prop;
@end

@implementation Class
@synthesize prop;

- (void)dealloc;
{
    self.prop = nil;
    //[prop release], prop=nil; works as well, even without doing an explicit iVar
    [super dealloc];
}
@end

Otros consejos

En Building, hago lo siguiente:

@interface SomeViewController : UIViewController

@property (nonatomic, copy) NSString *someString;

@end

y entonces

@implementation SomeViewController

@synthesize someString;

- (void)dealloc
{
    [someString release], someString = nil;
    self.someString = nil; // Needed?

    [super dealloc];
}

@end

Nota: En algún momento, Apple habilitará sintetizar por defecto que ya no requerirá la Directiva @Synthesize.

Puede acceder directamente a las variables de instancia utilizando -> símbolo en lugar de punto . (que invocará el método de accesor correspondiente de Ivar):

.h

@interface myClass {
}
@property(nonatomic, retain) NSIndexPath *indexPath

@end

.metro

@implementation myClass

- (void)dealloc {
    [self->indexPath release];
    self->indexPath = nil; // optional, if you need it

    [super dealloc];
}
@end

Por lo tanto, accederá directamente Ivar y no es su método accesor de accesorios correspondiente, obteniendo beneficio adicional: rendimiento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top