2011-03-13 11 views
14

Estoy tratando de deshacerme de algunas de estas advertencias de mi aplicación de iPhone. El que más obtengo es cuando tengo una función vacía y la llamo usando [self myFunction] ;. La advertencia está en la línea donde llamo a la función y dice: "Método '-myFunction' no encontrado (el tipo de retorno está predeterminado en 'id')". ¿Qué debo hacer para solucionar esto? GraciasCómo soluciono esta advertencia: "Método no encontrado (tipo de retorno predeterminado en 'id')"

+0

Sugiero que edite su pregunta para incluir el fragmento de código en cuestión. – payne

+0

¿Puede publicar su declaración de método (.h) y el código de llamada? –

+4

+1 para tratar de corregir advertencias, ¡esta es una muy buena práctica! Mientras lo hace, hay varias casillas de verificación en la configuración del proyecto donde puede hacer que el compilador advierta de más cosas. – mvds

Respuesta

18

declarar la función en el archivo de cabecera, así:

-(void)myFunction; 

o

-(NSString*)myFunction; 
-(id)myFunction; 
-(NSInteger)myFunction; 
-(BOOL)myFunction; 

, etc, etc

Esto es más importante que simplemente silenciar el compilador: si el tipo de retorno de una función no es un puntero (id o anything*), especialmente cuando no tiene el mismo tamaño, puede obtener t muy extraño y difícil o encontrar errores.

E.g. si una función devuelve una estructura CGRect, y el compilador asume id (como dice la advertencia), sucederán cosas realmente extrañas.

+0

Bien, gracias. Además, si no devuelvo nada y solo es una función, ¿utilizo el vacío? – Preston

+0

sí, eso es correcto! – mvds

+1

Estrictamente hablando, el (vacío) no es necesario si no devuelve nada; pero la OMI siempre debe escribirlo para que su código sea comprendido más rápidamente por otros que lo lean. – Dave

1

Asegúrese de tener - (void) myFunction; declarado en su archivo de encabezado y TAMBIÉN asegúrese de que myFunction no devuelva nada.

6

Debe definir esa función en su archivo de encabezado (.h) (si debe ser visible para otras clases), o en su archivo de implementación (.m) si es privado para su clase.

Por ejemplo, si se utiliza un método:

-(void)myFunction { 
    // do something 
} 

Para una función de "privado", añade esta en la parte superior de su archivo .m; antes de la línea @implementation MyCoolClass.

@interface MyCoolClass() // <--- no 'category name' hides methods just for this file 
-(void)myFunction;  // <--- add the method here 
-(void)myOtherFunction; 
-(void)doSomeCoolThingWithThisString:(NSString *)firstName; 
@end 

O si desea llamar al método de otros archivos, agregarlo en su archivo .h, dentro de la sección 'interfaz'; después de todas sus propiedades, y antes del @end.

¡Buena suerte!

+0

¿Es esta una buena práctica? – JonWells

+0

Claro. Es común "ocultar" métodos a través de una categoría "privada" si no son parte del contrato de ese objeto con otros. Si ve el método no encontrado advertencia; en general, es una de dos cuestiones: 1) ese método no existe para ese objeto; 2) no incluiste el archivo de encabezado Para aclarar, no sugiero que agregue una declaración para un método que no escribió. – Dave

3

debe importar el archivo .h que el suyo contiene métodos

1

Sólo asegúrese de que la función se coloca antes de la persona que llama en su archivo .m !! No sé si esta es la forma correcta de hacer las cosas, pero elimina todas esas advertencias para mí.

Y en el código de ejemplo de apple, no veo que declaren todos los métodos en el archivo h o m. Solo puedo usarlo de inmediato.

0

Asegúrese de que el objeto que está utilizando tiene esta función declarada también en su archivo de encabezado.

sky.h:

@interface sky : object { 

} 

-(void) doSomething:(int)param; 

@end 

sky.m:

#import "sky.h" 
@implementation sky 

-(void) doSomething:(int)param 

{ 

    //dosomething usefull 
} 
1

tuve un problema similar pop-up para mí y que era porque tenía otro archivo de cabecera con el mismo nombre en un sub-directorio diferente dentro del proyecto que pensé que había borrado Esto finalmente hizo que el compilador pensara que el método no estaba declarado en el encabezado porque estaba buscando en el archivo de encabezado incorrecto.

2

decido este problema siguiente:

--file: MyObjectController.h--

#import "MyObject.h" 

@interface MyObjectController 
{ 
    MyObject * obj; 
} 
-(void) makeSomething; 

@end 

--file:

#import "MyObjectController.h" 

@implementation MyObjectController 

-(void) makeSomething {} 

@end 

--- archivo MyObjectController.mm-- MyObject.h ----

@class MyObjectController; 

@interface MyObject 
{ 
    MyObjectController * objController; 
} 
-(void) callMakeSomethingFromObjController; 

@end 

--- archivo MyObject.mm ----

#import "MyObject.h" 
#import "MyObjectController.h" //Add this line!!! And compiller will found makeSomething  

@implementation MyObject 

-(void) callMakeSomethingFromObjController 
{ 
    [objController makeSomething];//warning was here:instance method '-makeSomething' not found (return type defaults to 'id') 
} 

@end 
Cuestiones relacionadas