346 votos

¿Cuáles son las mejores prácticas que se utilizan al escribir Objective-C y Cocoa?

Yo sé acerca de la HIG (lo cual es bastante práctico!), pero, ¿qué prácticas de programación ¿utiliza al escribir Objective-C, y más concretamente, cuando el uso de Cacao (o CocoaTouch).

398voto

Hay un par de cosas que he empezado a hacer, que no creo estándar son:

1) Con el advenimiento de propiedades, yo ya no uso "_" prefijo "privado" de las variables de la clase. Después de todo, si una variable se puede acceder por otras clases no hay una propiedad? Siempre me gustaba el "_" prefijo para hacer el código más fea, y ahora voy a dejarla fuera.

2) Hablando de cosas privadas, prefiero lugar privado definiciones de método en el archivo .m en una extensión de la clase así:

#import "MyClass.h"

@interface MyClass ()
- (void) someMethod;
- (void) someOtherMethod;
@end

@implementation MyClass

¿Por qué abrir el archivo .h con las cosas que los forasteros no debe cuidar? El empty () funciona de categorías privadas en el archivo .m, y emite advertencias de compilación si no se implementan los métodos declarados.

3) me han llevado a poner dealloc en la parte superior de la .m archivo, justo debajo de la @sintetizar las directivas. No lo que dealloc estar en la parte superior de la lista de cosas que usted quiere pensar en una clase? Eso es especialmente cierto en un ambiente como el del iPhone.

3.5) En las celdas de la tabla, hacen que cada elemento (incluyendo la propia célula) opaco para el rendimiento. Esto significa establecer el correspondiente color de fondo en todo.

3.6) Cuando se utiliza una NSURLConnection, como regla general usted así lo desea, para implementar el método de delegado:

- (NSCachedURLResponse *)connection:(NSURLConnection *)connection
                  willCacheResponse:(NSCachedURLResponse *)cachedResponse
{
      return nil;
}

Me parece que la mayoría de las llamadas por internet son muy singular y es más la excepción que la regla te voy a querer respuestas caché, sobre todo para las llamadas al servicio web. La aplicación del método, como se muestra deshabilita el almacenamiento en caché de las respuestas.

También de interés, son algunos buenos iPhone consejos específicos de José Mattiello (recibido en un iPhone de la lista de correo). Hay más, pero estos fueron los más generalmente útil pensé (ten en cuenta que algunos de los bits han sido ligeramente editada del original de incluir los detalles ofrecidos en las respuestas):

4) utilice Solamente de doble precisión, si es necesario, como cuando se trabaja con CoreLocation. Asegúrese de que usted terminar su constantes en 'f' para que gcc almacenarlos como flotadores.

float val = someFloat * 2.2f;

Esto es sobre todo importante cuando someFloat puede ser en realidad un doble, no es necesario el modo mixto de matemáticas, puesto que se está perdiendo precisión en 'val' en el almacenamiento. Mientras que los números de punto flotante se admiten en hardware en el iphone, se puede tomar aún más tiempo para hacer de doble precisión aritmética como contraposición a la precisión única. Referencias:

En los antiguos teléfonos que supuestamente los cálculos funcionan a la misma velocidad, pero puede tener más de una sola componentes de precisión en los registros de dobles, por lo que para muchos cálculos de precisión simple va a terminar siendo más rápido.

5) Establezca sus propiedades como nonatomic. Son atomic por defecto y en síntesis, el semáforo de código para prevenir el multi-threading problemas. el 99% de los que usted probablemente no tiene que preocuparse acerca de esto, y el código es mucho menos hinchado y la memoria con más eficacia cuando se establece en nonatomic.

6) SQLite puede ser muy, muy rápido camino a la caché de grandes conjuntos de datos. Una aplicación de mapas, por ejemplo, puede caché de sus iconos en archivos SQLite. La parte más cara es el disco I/O. Evitar muchas pequeñas escribe enviando BEGIN; y COMMIT; entre grandes bloques. Hacemos uso de un temporizador de 2 segundos, por ejemplo, que se reinicia en cada nueva presentar. Cuando expira, enviamos a COMETER; , lo que hace que todos sus escrituras a pasar en una gran parte. SQLite almacena los datos de la transacción en el disco y hacerlo de comienzo/Fin de envolver evita la creación de muchos de los archivos de transacciones, agrupando todas las transacciones en un archivo.

Además, SQL bloqueará su GUI si es en el hilo principal. Si usted tiene una muy larga consulta, Es una buena idea para almacenar sus consultas como objetos estáticos, y ejecutar el SQL en un subproceso independiente. Asegúrese de envolver cualquier cosa que modifique la base de datos para cadenas de consulta en @synchronize() {} bloques. Para corto consultas simplemente dejar las cosas en el hilo principal para facilitar la comodidad.

Más SQLite consejos de optimización están aquí, a pesar de que el documento aparece de la fecha muchos de los puntos son probablemente buenas;

http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html

109voto

mmalc Puntos 7663

No utilice desconocido cadenas de caracteres las cadenas de formato

Cuando los métodos o funciones de realizar una cadena de formato argumento, usted debe asegurarse de que usted tiene control sobre el contenido de la cadena de formato.

Por ejemplo, cuando el registro de las cadenas, es tentador para pasar la variable de cadena como el único argumento para NSLog:

    NSString *aString = // get a string from somewhere;
    NSLog(aString);

El problema con esto es que la cadena puede contener caracteres que se interpretan como las cadenas de formato. Esto puede conducir a una salida errónea, bloqueos y problemas de seguridad. En su lugar, se debe sustituir la variable de cadena en una cadena de formato:

    NSLog(@"%@", aString);

107voto

Chris Hanson Puntos 34485

Utilizar el estándar de Cacao de nombres y convenciones del formato y la terminología en lugar de lo que usted está acostumbrado en otro ambiente. Allí son un montón de Cacao a los desarrolladores por ahí, y cuando uno de ellos comienza a trabajar con el código, que va a ser mucho más accesible si se ve y se siente similar a otros de Cacao código.

Ejemplos de qué hacer y qué no hacer:

  • No declarar id m_something; en el interfaz de un objeto y llamar a un miembro de la variable o campo; el uso something o _something por su nombre y llamar a una variable de instancia.
  • No nombre de un captador -getSomething; el buen Cacao en nombre -something.
  • No nombre de un setter -something:; cabe -setSomething:
  • El nombre del método que se entremezcla con los argumentos e incluye dos puntos; es -[NSObject performSelector:withObject:], no NSObject::performSelector.
  • El uso de inter-caps (CamelCase) en los nombres de método, los parámetros, las variables, nombres de clase, etc. en lugar de underbars (se subraya).
  • Clase de nombres empiezan con una letra mayúscula, la variable, el método de nombres con minúsculas.

Hagas lo que hagas, no uso de Win16 y Win32-estilo de notación húngara. Incluso Microsoft dio por vencido en la que con el traslado a la .NET de la plataforma.

106voto

mmalc Puntos 7663

IBOutlets

Históricamente, la gestión de la memoria de puntos de venta ha sido pobre. La mejor práctica actual es declarar, puntos de venta, propiedades:

@interface MyClass :NSObject {
    NSTextField *textField;
}
@property (nonatomic, retain) IBOutlet NSTextField *textField;
@end

El uso de propiedades hace que la gestión de la memoria semántica clara; también proporciona un patrón consistente si utiliza la variable de instancia de síntesis.

97voto

mmalc Puntos 7663

El uso de la LLVM/Clang Analizador Estático

NOTA: Bajo Xcode 4 este es ahora integrado en el IDE.

Utilice el Analizador Estático Clang -- como era de esperar -- analizar el C y el código Objective-C (no C++ aún) en Mac OS X 10.5. Es trivial para instalar y utilizar:

  1. Descargar la última versión de esta página.
  2. Desde la línea de comandos, cd para el directorio del proyecto.
  3. Ejecutar scan-build -k -V xcodebuild.

(Hay algunas restricciones adicionales, etc., en particular, se debe analizar un proyecto en su "Depuración" de configuración-ver http://clang.llvm.org/StaticAnalysisUsage.html para más detalles -- el pero eso es más o menos lo que se reduce).

El analizador de entonces se produce un conjunto de páginas web para usted que muestra la probabilidad de administración de memoria y otros problemas básicos que el compilador no es capaz de detectar.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X