objective-c - 使用 gcc 4.6.2 编译 Objective-C

标签 objective-c

我正在尝试在 Windows 上学习 objective-c 。我的程序编译时出现警告

我的代码是

#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 alloc] init];
    [myGreeter greet];
    [myGreeter release];
    return EXIT_SUCCESS;
}

我使用以下命令在 GNUStep 上编译我的程序
 gcc -o Greeter Greeter.m -I /GNUstep/System/Library/Headers -L /GNUstep/System/Libra
 /Libraries -lobjc -lgnustep-base -fconstant-string-class=NSConstantString

我在编译时收到以下警告
: 'Greeter' may not respond to '+alloc' [enabled by default]
: (Messages without a matching method signature [enabled by default]
: will be assumed to return 'id' and accept [enabled by default]
: '...' as arguments.) [enabled by default]
: no '-init' method found [enabled by default]
: no '-release' method found [enabled by default]

所以当我运行我的可执行文件时,对象不会被实例化。

我正在使用 MinGW 的 gcc,其中 gcc 版本为 4.6.2

- 更新 - -

当我从 NSObject 而不是 Object 扩展时,程序运行良好

--更新 2 ----

我的 Object.h 看起来像
#include <objc/runtime.h>

@interface Object
{
    Class isa;
}
@end

--更新 3 ----

我修改了我的代码如下。它编译得很好,但我不确定这是否是解决问题的正确方法
@interface Greeter
{
  /* This is left empty on purpose:
   ** Normally instance variables would be declared here,
   ** but these are not used in our example.
   */
}

- (void)greet;

+ (id)alloc;
- (id)init;
- release;

@end

#include <stdio.h>

@implementation Greeter

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

+ (id)alloc
  {
    printf("Object created");
    return self;
  }

- (id)init
  {
    printf("Object instantiated");
    return self;
  }

- release {}

@end

#include <stdlib.h>

int main(void)
{
    id myGreeter;
    myGreeter=[[Greeter alloc] init];
    [myGreeter greet];
    [myGreeter release];
    return EXIT_SUCCESS;
}

最佳答案

除非你正在研究Objective-C的历史,否则试图学习基于Object类的语言完全是在浪费时间。 Object class 在 1994 年之前的 NEXTSTEP 中最后被普遍用作根类。

如果您的目标是学习 1994 年之前的 Objective-C,请说明,因为如果是这样,那么到目前为止您的答案是完全错误的。即使目标是采用现代模式,答案也更接近 How do I recreate NSObject?比什么都重要。请注意,如果那是您的目标......好吧......去吧! 1994 年之前的 Objective-C 有点像 OOP 宏汇编,通过它,在金属的简单性上有很大的力量。

例如,您说“我已按如下方式修改了我的代码。它编译得很好,但我不确定这是否是处理事情的正确方法”。

该代码可以编译,但是——不—​​—它不起作用。一点也不。首先,+alloc方法实际上并没有分配任何东西。 Greeter 也没有类实现了足够多的功能来充当 NSObject 之类的事情.

如果您的目标是学习类似于现代 Objective-C 的东西并使用 Windows 来实现,那么最好的方法可能是安装 GNUStep 工具链。这样,至少,您将针对 NSObject 进行编程。类似于现代 Cocoa(以及在较小程度上,iOS)的一组 Root API。

如果您的目标是学习真正现代的 Objective-C,那么您至少需要一个可以运行最新版本 LLVM 的环境。而且,当然,如果您想编写基于 Objective-C 的 iOS 或 Mac OS X 应用程序,您需要一台运行 Lion 的 Mac。

关于objective-c - 使用 gcc 4.6.2 编译 Objective-C ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10119971/

相关文章:

objective-c - 除了一个源文件之外的所有源文件中的前缀头?

iOS:UIColor 不支持红色、绿色、alpha 和蓝色。显示其他颜色?

ios - "No routes found"在谷歌地图上首次启动

ios - 使用 OCMock 期待来自非实例化变量的方法调用

ios - 跳过单例对象的初始化?

ios - 如何以编程方式展开到 2 个不同的 VC

ios - 选择时关闭 UIPopover

objective-c - 使用 RestKit 将 bool 属性从 JSON 映射到 NSManagedObject

objective-c - 点语法和方括号语法有什么区别?

ios - 不同项目的不同宽度 - 在 iCarousel 中