2011-06-14 18 views
7

Esta aplicación es un código reescrito del libro Cococa and Objective C Up and Running.Advertencia de "Implementación incompleta" en XCode 4.0

Como trato de entender todo al principio, me gustaría saber dónde cometí un error en el siguiente código. Para mí, todo se ve bien.

Podría, por lo tanto, ayudarme a identificar la fuente de la advertencia:

Incomplete Implementation 

Tengo esto en la línea de @implementation Photo en Photo.m archivo de código fuente?

Photo.h

#import <Foundation/Foundation.h> 


@interface Photo : NSObject{ 

    NSString* caption; 
    NSString* photographer;  
} 

+ (Photo*) photo; 

- (NSString*) caption; 
- (NSString*) photographer; 

- (void) setCaption: (NSString*)input; 
- (void) setPhotographer: (NSString*)input; 

@end 

Photo.m

#import "Photo.h" 


@implementation Photo // <- Incomplete Implementation? 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     [self setCaption:@"Default Caption"]; 
     [self setPhotographer:@"Default Photographer"]; 
    } 

    return self; 
} 


+ (Photo*) caption { 
    Photo* newPhoto = [[Photo alloc] init]; 
    return [newPhoto autorelease]; 
} 


- (NSString*) caption { 
    return caption; 
} 


- (NSString*) photographer { 
    return photographer; 
} 


- (void) setCaption:(NSString *)input { 
    [caption autorelease]; 
    caption = [input retain]; 
} 


- (void) setPhotographer: (NSString *)input { 
    [photographer autorelease]; 
    photographer = [input retain]; 
} 


- (void)dealloc 
{ 
    [self setCaption:nil]; 
    [self setPhotographer:nil]; 

    [super dealloc]; 
} 

@end 

lo uso Snow Leopard 10.6.7 y Xcode 4.0.0.

+0

Su pregunta fue respondida rápidamente (ver a continuación), pero aparte, ¿hay alguna razón por la que esté usando propiedades y @synthesize para sus variables en lugar de hacerlo manualmente? the getter and setter? –

+0

@Jesse: Hola, Jesse. Sí, tienes razón, mi pregunta fue respondida al instante. No hay ninguna razón. Acabo de empezar a aprender * Objective-C *. Si tienes algo que agregar para hacer mi código mejor, yo wil Estaré feliz de absorberlo. Como mi conocimiento sobre Objective-C es muy limitado, debo seguir lo que ofrece el libro. –

+0

lo pondré en mi respuesta muy rápido. –

Respuesta

8

A menos que su un error tipográfico, su método de clase define como + (Photo*) Photo; No se implementa (hay un método + (Photo*) Caption {} que se ve es sólo un accidente

Editar:. Una forma más sencilla de hacerlo tiene esta funcionalidad es utilizar propiedades, que son un atajo que crear el getter y setter para una variable para nosotros, (véase este enlace para el tutorial de un buen principiante: iPhone 101) para sus variables de instancia de este modo:

en su archivo .h:

@interface Photo : NSObject{ 

    NSString* caption; 
    NSString* photographer;  
} 
@property (nonatomic, retain) NSString *caption; 
@property (nonatomic, retain) NSString *photographer; 
@end 

en su archivo .m:

@implementation Photo 
@synthesize caption, photographer; 

    //Other stuff (init and any custom methods for class etc.. NOT getters and setters for variables) 
    - (void)dealloc 
    { 
     [caption release]; 
     [photographer release]; 

     [super dealloc]; 
    } 
+0

+1, hola Jesse. Sí, ese fue mi error. Muchas gracias por su respuesta. Eres muy amable. –

+0

gracias por este valor adicional. Debido a que estabas preocupado y me diste consejos prácticos adicionales que me ayudarán a escribir mejor el código Objective-C, he reevaluado mi selección de la mejor respuesta. Creo que esta es la mejor respuesta ahora, y por lo tanto, estoy marcando esto como la 'Respuesta aceptada'. –

+0

como veo, se espera que prácticamente todas las propiedades de Objective-C tengan su propio setter y getter, y que sus variables miembro nunca se configuren directamente. –

4

Usted está recibiendo este error debido a que en el archivo de cabecera que ha declarado que no habría un método:

+ (Photo*) photo; 

pero no puso en práctica en el archivo m.

EDIT:

Se ve así:

+ (Photo*) caption { 
    Photo* newPhoto = [[Photo alloc] init]; 
    return [newPhoto autorelease]; 
} 

debería ser:

+ (Photo*) photo { 
    Photo* newPhoto = [[Photo alloc] init]; 
    return [newPhoto autorelease]; 
} 
+0

+1 y gracias también. Lo he pasado por alto, ya que muchas cosas son nuevas para mí. Cambié de Visual Studio y Visual C++, y este es mi segundo día en XCode. Tu ayudaste. –

2

Te faltan +photo porque accidentalmente escribió caption:

+ (Photo*) caption { 
    Photo* newPhoto = [[Photo alloc] init]; 
    return [newPhoto autorelease]; 
} 

debería ser

+ (Photo*) photo { 
    Photo* newPhoto = [[Photo alloc] init]; 
    return [newPhoto autorelease]; 
} 
+0

+1, hola Jeremy, y muchas gracias. realmente me ayudaste, y tu respuesta fue prácticamente instantánea. :-) –

1

Tu.m archivo no tiene la implementación para:

+ (Photo*) photo; 

Ese es el método que falta.

+0

+1, hola Mihir. Estaba pasando por alto esa línea. Muchas gracias. –

1

intente cambiar

+ (Photo*) caption { 
    Photo* newPhoto = [[Photo alloc] init]; 
    return [newPhoto autorelease]; 
} 

a

+ (Photo*) photo { 
    Photo* newPhoto = [[Photo alloc] init]; 
    return [newPhoto autorelease]; 
} 
+0

+1 -hi, eso debería ser. Muchas gracias. –

4

En general, al pasar el ratón sobre la advertencia, no te va a qué método es que falta decirlo, pero hay al menos dos formas para obtener esta información:

  1. Tipo Comando-4 o seleccione la vista del navegador de Emisión (el icono de triángulo en una!), entonces ex pand la advertencia de "Problema semántico" para este problema. Aparecerá un mensaje que indica que "Definición de método para" "no encontrado.

  2. Escriba Cmd-7 o seleccione la Vista de registro (el icono situado más a la derecha que se parece a una burbuja de subtítulos), luego seleccione el problema apropiado de la lista. Verá el mismo mensaje.

Cuestiones relacionadas