【问题标题】:"Incomplete implementation" warning in XCode 4.0XCode 4.0 中的“不完全实现”警告
【发布时间】:2023-03-22 11:44:01
【问题描述】:

此应用程序是从Cococa and Objective C Up and Running 书中重写的代码。

当我开始尝试理解所有内容时,我想知道我在下面的代码中哪里出错了。对我来说,一切看起来都很好。

因此,您能否帮我确定警告的来源:

Incomplete Implementation

我在Photo.m 源代码文件的@implementation 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

照片.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。

【问题讨论】:

  • 您的问题很快得到了回答(见下文),但顺便说一句,您是否有任何理由使用属性和 @synthesize 作为变量而不是手动执行 getter 和 setter?
  • @Jesse:嗨,Jesse。是的,你是对的,我的问题立即得到了回答。根本没有理由。我刚开始学习Objective-C。如果您有任何要添加的内容以使我的代码更好,我将很乐意吸收它。由于我对 Objective-C 的了解非常有限,因此我必须遵循本书提供的内容。
  • 我很快就会把它放在我的答案中。

标签: objective-c xcode xcode4


【解决方案1】:

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

编辑:实现此功能的一种更简单的方法是使用 properties,这是为我们创建变量的 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,嗨,杰西。是的,那是我的错误。非常感谢您的回答。你很善良。
  • 感谢您提供的额外价值。因为您很关心并为我提供了额外的实用建议,这将帮助我编写更好的 Objective-C 代码,所以我重新评估了我选择的最佳答案。我认为,这是现在最好的答案,因此,我将其标记为 已接受的答案
  • 正如我所见,几乎每个 Objective-C 属性都有自己的 setter 和 getter,而且它们的成员变量从不直接设置。
  • @Bunkai.Satori:事实上,默认情况下,其他对象不能直接访问成员变量。这由scope of the ivars 管理。
【解决方案2】:

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

+ (Photo*) photo;

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

编辑:

看起来像这样:

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

应该是:

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

【讨论】:

  • +1,也谢谢你。我忽略了这一点,因为很多事情对我来说都是新的。我从 Visual Studio 和 Visual C++ 切换,这是我在 XCode 上的第二天。你帮了忙。
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

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

    应该是

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

    【讨论】:

    • +1,您好 Jeremy,非常感谢您。你真的帮助了我,你的回答几乎是即时的。 :-)
    【解决方案5】:

    您的 .m 文件没有实现:

    + (Photo*) photo;
    

    这是缺少的方法。

    【讨论】:

    • +1,嗨,米希尔。我忽略了那条线。非常感谢。
    【解决方案6】:

    尝试改变

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多