No hay respuesta de corte y secado. Sin embargo, recuerde que la optimización prematura es mala. En Cocoa en la Mac, o en el iPhone, se requiere que el uso de accesadores/propiedades sea compatible con KVO. La conformidad de KVO es necesaria para que los datos centrales y los enlaces de cacao funcionen automáticamente. En Core Data, no solo es necesario garantizar KVO al modificar las propiedades, sino también al acceder a ellas.
También es mejor utilizar accesos/propiedades cuando desea garantizar el comportamiento de administración de la memoria de propiedades, es decir, siempre al establecer un ivar para usar la notación de establecimiento o punto, y dependiendo de qué patrón de gestión de memoria siga , para usar siempre accesos/propiedades al obtener un ivar.
Existen varios patrones de administración de memoria diferentes. Todos los no rotos garantizan que un objeto devuelto por un descriptor de acceso sobrevivirá al menos hasta el final del alcance de liberación automática actual. Es decir, el objeto se retiene explícitamente y se libera automáticamente en el ámbito de liberación automática actual. El método recomendado por Apple hace esto de manera explícita en el captador:
- (id)foo {return [[foo retain] autorelease]; }
- (void)setFoo:(id)aFoo {
if(! [aFoo isEqual:foo]) {
[foo release];
foo = [aFoo retain];
}
}
Queda implícito que es el patrón que siguen en sus descriptores de acceso sintetizados. En lo personal, prefiero AutoRelease en la incubadora:
- (id)foo {return foo;}
- (void)setFoo:(id)aFoo {
[foo autorelease];
foo = [aFoo retain];
}
Este autoreleasees el valor anterior antes de reemplazarlo con el nuevo valor. Esto tiene exactamente el mismo efecto que retener y autorrellenar en el captador, pero requiere que el objeto solo se agregue a un grupo de autorrelease una vez. La mayoría de las veces tiene un conteo retenido de uno y no se libera automáticamente, por lo que no irá a ningún lado sin importar lo que suceda. Si la propiedad se reemplaza durante algún código que aún se mantiene (como en una devolución de llamada delegada), no desaparecerá de debajo.
Lo que esto significa es que el uso de accesadores/propiedades le dará la confianza de que sus objetos estarán disponibles todo el tiempo que lo necesite sin que otra parte del código los libere.
La última y mejor razón para usar siempre accessors/properties es que hace una suposición menos para cada propiedad: que hay un ivar subyacente para esa propiedad, y que tiene el mismo nombre (supongo que son dos suposiciones) . Tal vez en el futuro desee reemplazar un ivar con un descriptor de acceso derivado. La notación de propiedades seguirá funcionando. Quizás quieras renombrar el ivar; la propiedad seguirá funcionando. Afortunadamente, se puede confiar en la refactorización en Xcode, pero ¿por qué molestarse?
El objetivo de la programación orientada a objetos es utilizar las interfaces definidas en la clase. No hay una buena razón (aunque hay muchas perjudiciales y racionalizadas) para que una clase ignore su propia interfaz. Todos los métodos, excepto los usuarios mismos, deberían, en el caso general, tratar el objeto como sacrosanto y su estado interno como privado. Escriba cada método como si estuviera en una categoría o en una subclase, y trate a ivars como un estado privado, a menos que el diseño específico necesite instrucciones directas de lo contrario. Hay muchas buenas razones para acceder directamente a los ivars, pero se determinan caso por caso.
Encontré una publicación similar aquí: http://stackoverflow.com/questions/1051543/should-i-use-self-keyword-properties-in-the-implementation – Jonah