2012-01-12 13 views
6

Estoy viendo el video del curso Desarrollos de la aplicación para iPad y iPhone de la Universidad de Stanford. El instructor dice en el video que podemos controlar y arrastrar un objeto UI a los archivos de implementación para crear una acción. Pero de esta forma, el método no se declarará en el archivo de encabezado. ¿Esto significa que está bien implementar métodos en el archivo .m pero no declarar en el archivo .h?¿No podemos declarar métodos en los archivos de encabezado?

Respuesta

6

depende de cómo se defina "ok" :-)

Objective-C utiliza método dinámico búsqueda y realmente no exige el acceso ("privado", "público", etc.). Entonces no necesita para declarar cualquier método en un archivo de encabezado.

Sin embargo, terminará luchando contra el compilador, ya que hace una buena cantidad de comprobación de tipos a menos que convenza de que no, y perderá al hacerlo.

5

No es necesario que declare en el archivo de encabezado todos los métodos en la implementación. Pero si no está en el archivo de encabezado obviamente no puede hacer referencia a ellos por nombre literal en otro archivo, ni puede "reenviarlos" en el archivo de implementación.

(Tenga en cuenta que esto no es tan diferente de C regular, pero es diferente de los métodos de una clase en C++.)

+0

El comportamiento del compilador parece haber cambiado un poco en Xcode 4.5. Tengo un montón de métodos que no declare en .h y no tengo errores de compilación. Sin embargo, cuando tomo este código en Xcode 4.2 para verificar la compatibilidad con iOS 4.3, el compilador arroja errores. – JScarry

+0

@JScarry - He observado un comportamiento similar, aunque parece variar con algún tipo de indicador del compilador. Pero Xcode 4.5 está presionando el uso de una versión '()' de '@ interface' en .m, y puede pegar allí todas las declaraciones internas. –

5

Se trata de "OK" para no declarar métodos en la cabecera sí, bajo ciertas circunstancias. Por ejemplo, si usa ARC, el compilador generalmente necesita conocer la firma del método para que pueda hacer lo correcto. Pero básicamente, todo lo que significa es que, donde sea que estés usando el método, ya debe saber sobre el método que estás llamando.

Como está hablando de Interface Builder, es un poco diferente ya que conocerá todos los métodos ya que puede "ver" todo el contexto de su encabezado y los archivos de implementación y saber que existe un método. es decir, en mi terminología anterior, el método se ha definido antes de su uso.

Con respecto a la definición antes de su uso, el enfoque aceptado general es ya sea:

  1. definir un método en el archivo de interfaz (.h). ej .:

    MyClass.h

    @interface MyClass : NSObject 
    - (void)someMethod; 
    @end 
    

    MyClass.m

    @implementation MyClass 
    - (void)someMethod { 
        // do something 
    } 
    @end 
    
  2. definir un método en una categoría continuación clase. por ejemplo:

    MyClass.h

    @interface MyClass : NSObject 
    @end 
    

    MyClass.m

    @interface MyClass() 
    - (void)someMethod; 
    @end 
    
    @implementation MyClass 
    - (void)someMethod { 
        // do something 
    } 
    @end 
    
Cuestiones relacionadas