XCode 4.0中的“不完整实现”警告

时间:2011-06-14 20:00:49

标签: objective-c xcode xcode4

此应用程序是Cococa and 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 个答案:

答案 0 :(得分:8)

除非是拼写错误,否则您的Class方法定义为+ (Photo*) Photo;没有实现(有一个+ (Photo*) Caption {}方法看起来只是一个意外。

编辑:更简单的方法是使用属性,这是一个为我们创建变量的getter和setter的快捷方式(请参阅此链接以获得一个好的初学者教程: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];
    }

答案 1 :(得分:4)

您收到此错误,因为在您的头文件中,您声明会有一个方法:

+ (Photo*) photo;

但你没有在m文件中实现它。

编辑:

看起来像这样:

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

应该是:

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

答案 2 :(得分:4)

通常,当您将鼠标悬停在警告上时,它不会告诉您缺少哪种方法,但至少还有其他两种方法可以获取此信息:

  1. 键入Cmd-4或选择“问题导航器”视图(三角形图标中的!),然后展开此问题的“语义问题”警告。然后,您将看到一条消息,指出“方法定义”为“未找到”的效果。

  2. 键入Cmd-7或选择日志视图(最右边的图标,看起来像字幕气泡),然后从列表中选择相应的问题。您将看到相同的消息。

答案 3 :(得分:2)

您遗失了+photo,因为您不小心输入了caption

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

应该是

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

答案 4 :(得分:1)

您的.m文件没有实现:

+ (Photo*) photo;

这是缺少的方法。

答案 5 :(得分:1)

尝试更改

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

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