这个简单的Objective-C代码到底有什么问题?

这个简单的Objective-C代码到底有什么问题?,objective-c,Objective C,我目前正在从C语言转向Objective-C语言,对我来说,这段代码似乎都是一个花花公子,但Xcode却不这么认为。我从互联网上获得了这个代码示例,并一直在不懈地尝试更正它,但我已经走到了死胡同: #include <objc/Object.h> @interface Greeter:Object { /* This is left empty on purpose: ** Normally instance variables would be declared

我目前正在从C语言转向Objective-C语言,对我来说,这段代码似乎都是一个花花公子,但Xcode却不这么认为。我从互联网上获得了这个代码示例,并一直在不懈地尝试更正它,但我已经走到了死胡同:

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

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

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

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

你应该去读一本关于Objective-C的好书,比如Stephen Kochan的《Objective-C编程》


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

你应该去读一本关于Objective-C的好书,比如Stephen Kochan的《Objective-C编程》


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

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

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

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

Greeter:Object
应该是
Greeter:NSObject
,“Object”不是objective-c类。

Greeter:Object
应该是
Greeter:NSObject
,“Object”不是objective-c类。

实际上使用new is,某种程度上,是alloc/init的缩写,正如您所读到的

但是,您在Cocoa之外使用objective-c,因为您是从Object继承的,而不是从NSObject继承的,等等。所以我认为应该显式地使用myGreeter=[[myGreeter alloc]init]

另外,既然您说的是Xcode,那么您应该使用Cocoa。尝试:

#import <Cocoa/Cocoa.h>
#导入

然后将Object切换到NSObject

,实际上使用new is,有点像alloc/init的缩写,正如您所读到的

但是,您在Cocoa之外使用objective-c,因为您是从Object继承的,而不是从NSObject继承的,等等。所以我认为应该显式地使用myGreeter=[[myGreeter alloc]init]

另外,既然您说的是Xcode,那么您应该使用Cocoa。尝试:

#import <Cocoa/Cocoa.h>
#导入

然后还将Object切换到NSObject

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

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

我也不是什么专家,但你为什么不说Greeter myGreeter=[Greeter new]?我不相信“id”会知道你的任何方法,即使你可以给它指定一个问候者。
new
alloc init
可以互换使用。你能发布XCode所说内容的控制台日志吗?@Marvo这很好,你在调用id方法时不会收到警告,因为如果它发出警告,它总是会发出警告,这很烦人。它会在运行时找出你的对象是什么,然后找到你的方法,我也不是什么专家,但是为什么你不说Greeter myGreeter=[Greeter new]?我不相信“id”会知道你的任何方法,即使你可以给它指定一个问候者。
new
alloc init
可以互换使用。你能发布XCode所说内容的控制台日志吗?@Marvo这很好,你在调用id方法时不会收到警告,因为如果它发出警告,它总是会发出警告,这很烦人。它将在运行时找出您的对象并找到您的方法,然后
new
是一种基本上将
alloc
/
init
混合到一个方法中的方法。到OSX出现的时候,它已经基本上被废弃了,但我认为一些Objective-C书籍或其他书籍使用了它(出于某种原因),所以最近学习Objective-C的程序员似乎正在使用它。
new
是一种基本上将
alloc
/
init
混合到一个方法中的方法。当OS X出现时,它几乎已经被废弃了,但我认为某些Objective-C书籍或其他书籍使用了它(出于某种原因),因此最近学习Objective-C的程序员似乎正在使用它。它实际上是一个旧的Objective-C类,来自原始规范。我尝试使用此导入进行编译,但它似乎不是为现代Mac电脑编写的。编辑:啊,我猜是运行时出了问题,根据epatel的帖子。它实际上是一个旧的Objective-C类,来自原始规范。我尝试使用此导入进行编译,但它似乎不是为现代Mac编译的。编辑:啊,我想是运行时出了问题,正如epatel的帖子所说。