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