Objective c XCode 4.0中的“未完成实现”警告

Objective c XCode 4.0中的“未完成实现”警告,objective-c,xcode,xcode4,Objective C,Xcode,Xcode4,此应用程序是从书中重写的代码 当我试图在一开始理解一切时,我想知道我在下面的代码中犯了什么错误。在我看来,一切都很好 因此,您能否帮助我确定警告的来源: Incomplete Implementation 我在Photo.m源代码文件的@implementation Photo行中得到了这个 照片.h 照片:m 我使用Snow Leopard 10.6.7和Xcode 4.0.0。您收到此错误是因为您在头文件中声明了一种方法: + (Photo*) photo; 但是您没有在m文件中实现它

此应用程序是从书中重写的代码

当我试图在一开始理解一切时,我想知道我在下面的代码中犯了什么错误。在我看来,一切都很好

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

Incomplete Implementation
我在Photo.m源代码文件的@implementation Photo行中得到了这个

照片.h

照片:m


我使用Snow Leopard 10.6.7和Xcode 4.0.0。

您收到此错误是因为您在头文件中声明了一种方法:

+ (Photo*) photo;
但是您没有在m文件中实现它

编辑:

看起来是这样的:

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

+ (Photo*) photo {
    Photo* newPhoto = [[Photo alloc] init];
    return [newPhoto autorelease];
}
您不小心键入了标题,因此缺少+照片:

应该是

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

除非是打字错误,否则类方法定义为+Photo*Photo;没有实现有一个+Photo*Caption{}方法,它看起来只是一个意外

编辑:实现此功能的一种更简单的方法是使用属性,属性是为变量创建getter和setter的快捷方式。请参阅此链接,以获得良好的初学者教程:对于您的实例变量,如:

在.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];
    }

您的.m文件没有以下内容的实现:

+ (Photo*) photo;
这是缺少的方法。

尝试更改

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


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

键入Cmd-4或选择问题导航器查看!在三角形图标中,然后展开此问题的语义问题警告。然后,您将看到一条消息,大意是“找不到”的方法定义

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


你的问题很快得到了回答,请看下面,但作为旁白,你有没有理由对变量使用属性和@synthesis,而不是手动执行getter和setter?杰西:嗨,杰西。是的,你是对的,我的问题马上得到了回答。根本没有理由。我刚刚开始学习Objective-C。如果您有什么需要补充的,以使我的代码更好,我将很乐意接受它。由于我对Objective-C的了解非常有限,我必须遵循这本书提供的内容。我会很快把它写进我的答案中。+1,你好,杰里米,非常感谢。你真的帮助了我,你的回答几乎是立竿见影的-+我也谢谢你。我忽略了这一点,因为许多事情对我来说都是新的。我从Visual Studio和Visual C++切换,这是我在XCODE上的第二天。你帮了忙,你好,杰西。是的,那是我的错误。非常感谢你的回答。你真是太好了。谢谢你提供的额外价值。因为,您关心我,并为我提供了额外的实用建议,这将帮助我编写更好的Objective-C代码,所以我重新评估了我选择的最佳答案。我认为,这是现在最好的答案,因此,我将此标记为已接受的答案。正如我所看到的,预期几乎每个Objective-C属性都有自己的setter和getter,并且它们的成员变量从不直接设置。@Bunkai.Satori:事实上,默认情况下,其他对象无法直接访问成员变量。这是由.1,hi-Mihir控制的。我正在俯瞰那条线。非常感谢你。
@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];
    }
+ (Photo*) photo;
+ (Photo*) caption {
    Photo* newPhoto = [[Photo alloc] init];
    return [newPhoto autorelease];
 }
+ (Photo*) photo {
    Photo* newPhoto = [[Photo alloc] init];
    return [newPhoto autorelease];
}