La diferencia entre usar un ivar y declarar una variable dentro de la implementación es que la variable dentro de la implementación se encuentra en el alcance del archivo y es global. Eso significa que todas las instancias (y cualquier método estático) compartirán la misma variable; es decir, si una instancia de su objeto cambia la variable, la cambiará para todas las instancias.
El caso de uso para definirlo en el alcance del archivo es almacenar cosas para métodos estáticos (métodos que actúan directamente sobre la clase en lugar de una instancia de la clase). Un caso de uso muy común para esto es el patrón de diseño de Singleton. Puede definir una instancia estática de su clase dentro de este archivo para que, en cualquier momento, pueda asegurarse de que está accediendo a la misma instancia. Puede proporcionar un método estático que devuelva esta instancia para que cualquier objeto en su código pueda acceder a ese mismo objeto llamando al método directamente en su clase.
actualización 4/17/14
La práctica común es utilizar ahora Properties. Esto crea getters y setters para que automáticamente la clase sea más extensible (si decides cambiar la forma en que funciona una propiedad, quizás quieras cambiarla para que siempre se calcule sobre la marcha, la interfaz pública de la clase no necesita cambiarse).)
Puede usar private class extensions to declare "private" properties and methods. Esto tiene el efecto de proteger determinadas propiedades y métodos de acceder a clases externas.
Una muy buena explicación podría ser esta: [Variable de clase definida en @implementation en vez de @interface?] (Http://stackoverflow.com/a/2571565/818506) –
Esta respuesta es un poco anticuada. Ahora es mucho mejor poner los ivars en la 'implementación @' pero asegúrese de usar llaves. Si está entre llaves, las variables serán variables de instancia. Sin las llaves, las variables serán variables globales. – rmaddy
"mucho mejor" es una exageración. Diría que quieres ponerlo en el archivo de implementación siempre que sea una variable con la que otras clases no deberían estar jugando. Sin embargo, generalmente es preferible usar propiedades ahora. Puede usar [extensiones de clase privadas para declarar propiedades y métodos "privados"] (https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html#//apple_ref/doc/uid/TP40011210-CH6-SW6). – drewag