这个简单的Objective-C代码究竟出了什么问题?

时间:2011-04-18 20:27:16

标签: objective-c

我目前正从C迁移到Objective-C,对我来说,这段代码似乎都是花花公子,但Xcode认为不然。我从互联网上获得了这个代码示例,并且一直在不断尝试纠正它,我来到了一个deadend:

#include <objc/Object.h>

@interface Greeter:Object
{
    /* This is left empty on purpose:
     ** Normally instance variables would be declared here,
     ** but these are not used in our example.
     */
}

- (void)greet;

@end

#include <stdio.h>

@implementation Greeter

- (void)greet
{
    printf("Hello, World!\n");
}

@end

#include <stdlib.h>

int main(void)
{

    id myGreeter;
    myGreeter = [Greeter new];

    [myGreeter greet];

    [myGreeter release];
    return 0;
}

错误似乎在myGreeter = [Greeter new];行,Xcode将问题隔离为Thread 1.我需要分配/ init吗?

以下是控制台日志:

[Switching to process 1833 thread 0x0]
2011-04-18 21:52:10.323 PROJ[1833:903] *** NSInvocation: warning: object 0x100001160 of class 'Greeter' does not implement methodSignatureForSelector: -- trouble ahead
2011-04-18 21:52:10.326 PROJ[1833:903] *** NSInvocation: warning: object 0x100001160 of class 'Greeter' does not implement doesNotRecognizeSelector: -- abort
sharedlibrary apply-load-rules all
Current language:  auto; currently objective-c
(gdb) 

6 个答案:

答案 0 :(得分:3)

您的班级Greeter继承自Objective-C Object班级。在Cocoa中,根类(通常)是NSObject,你应该继承它。这可能会解决您的问题。

答案 1 :(得分:2)

Greeter:Object应为Greeter:NSObject,“对象”不是Objective-c类。

答案 2 :(得分:0)

这不仅仅是Xcode调试器停止在“main”中的默认断点吗?只需单击“继续”(或“运行”菜单中的类似内容),您就应该是金色的。

答案 3 :(得分:0)

您的示例使用GNU运行时,因此有点弃用。编译器默认为NeXT运行时,但可以设置为使用GNU运行时和编译选项-fgnu-runtime

你应该研究一下关于Objective-C的好书,比如Stephen Kochan编写的“Objective-C编程”

http://www.amazon.com/Programming-Objective-C-Stephen-Kochan/dp/0672325861

答案 4 :(得分:0)

也许我错了,但我一直认为你在Objective-C中分配了这样的

id myGreeter;
myGreeter= [[myGreeter alloc] init];

答案 5 :(得分:0)

实际上,对于alloc / init,使用new是一种简写,你可以阅读here

然而,你在Cocoa之外使用objective-c,因为你继承自Object而不是NSObject等等。所以我认为你应该明确地使用myGreeter = [[myGreeter alloc] init];

此外,既然你说Xcode,你应该使用Cocoa。尝试:

#import <Cocoa/Cocoa.h>

然后还将Object切换到NSObject