Предупреждение «Неполная реализация» в XCode 4.0 - PullRequest
7 голосов
/ 15 июня 2011

Это приложение - переписанный код из книги Cococa и Objective C Up and Running .

Поскольку я пытаюсь понять все в начале, я хотел бы знать, где я сделалошибка в коде ниже.Для меня все выглядит хорошо.

Не могли бы вы, следовательно, помочь мне определить источник предупреждения:

Incomplete Implementation

Я получил это в строке @implementation Photo в Photo.m источникефайл кода?

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

Я используюSnow Leopard 10.6.7 и Xcode 4.0.0.

Ответы [ 6 ]

8 голосов
/ 15 июня 2011

Если это не опечатка, ваш метод класса определен как + (Photo*) Photo; не реализован (есть метод + (Photo*) Caption {}, который выглядит просто несчастным случаем.

Edit: более простой способ использовать эту функцию - использовать properties , которые являются ярлыком, создающим для нас метод получения и установки для переменной (см. Эту ссылку для хорошего урока для начинающих: iPhone 101 ) для переменных вашего экземпляра, например:

в вашем .h файле:

@interface Photo : NSObject{

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

в вашем файле .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];
    }
4 голосов
/ 22 марта 2013

Обычно, когда вы наводите курсор мыши на предупреждение, оно не сообщит вам, какой метод пропущено, но есть как минимум два других способа получить эту информацию:

  1. ТипCmd-4 или выберите представление Навигатор проблем (значок! В треугольнике), затем разверните предупреждение «Семантическая проблема» для этой проблемы.Затем вы увидите сообщение о том, что «Определение метода для» не найдено.

  2. Введите Cmd-7 или выберите «Просмотр журнала» (самый правый значок, похожий на пузырь с надписью), затем выберите соответствующую проблему из списка. Вы увидите то же сообщение.

4 голосов
/ 15 июня 2011

Вы получаете эту ошибку, потому что в своем заголовочном файле вы объявили, что будет метод:

+ (Photo*) photo;

но вы не реализовали его в файле m.

EDIT:

Это выглядит так:

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

должно быть:

+ (Photo*) photo {
    Photo* newPhoto = [[Photo alloc] init];
    return [newPhoto autorelease];
}
2 голосов
/ 15 июня 2011

Вам не хватает +photo, потому что вы случайно набрали caption:

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

должно быть

+ (Photo*) photo {
    Photo* newPhoto = [[Photo alloc] init];
    return [newPhoto autorelease];
}
1 голос
/ 15 июня 2011

попробуйте изменить

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

до

+ (Photo*) photo {
    Photo* newPhoto = [[Photo alloc] init];
    return [newPhoto autorelease];
}
1 голос
/ 15 июня 2011

Ваш файл .m не имеет реализации для:

+ (Photo*) photo;

Это недостающий метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...