【问题标题】:Objective c dictionary enumeration with blocks does not work on gcc with gnustep带有块的目标c字典枚举不适用于带有gnustep的gcc
【发布时间】:2013-04-07 03:10:48
【问题描述】:

我只是在学习 obj c。我正在使用从 gnustep.org/experience/Windows.html 下载的 GNUStep(有 3 个安装程序 - msys 系统、核心、开发)。

运行以下代码:

#import <Foundation/Foundation.h>

int main (int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    NSDictionary *m_Dict =
    [NSDictionary dictionaryWithObjectsAndKeys:
      @"ABC", @"One",
      @"DEF", @"Two",
      @"GHI", @"Three",
      nil ];

    // Print all key-value pairs from the dictionary

    [m_Dict enumerateKeysAndObjectsUsingBlock: ^(id key, id obj, BOOL *stop) {
        NSLog(@"%@ => %@", key, obj);
        }];

    [pool drain];
    return 0;
}

显示错误:

$ gcc -o c c.m -I /GNUstep/System/Library/Headers -L /GNUstep/System/Library/Li
``braries -lobjc -lgnustep-base -fconstant-string-class=NSConstantString
c.m: In function 'main':
c.m:16:44: error: expected expression before '^' token
c.m:18:1: warning: 'NSDictionary' may not respond to '-enumerateKeysAndObjectsUs
ingBlock:' [enabled by default]
c.m:18:1: warning: (Messages without a matching method signature [enabled by def
ault]
c.m:18:1: warning: will be assumed to return 'id' and accept [enabled by default
]
c.m:18:1: warning: '...' as arguments.) [enabled by default]c

请提出我做错了什么。在 Stackoverflow 上也搜索过,但找不到太多帮助。

【问题讨论】:

  • 你使用的是什么编译器+运行时?
  • 你需要 Clang。不要使用 GCC。并确保您安装了正确版本的运行时,当您不知道自己在做什么时,请使用 GNUstep-make 构建项目。
  • 我只是在学习obj c。我正在使用从 gnustep.org/experience/Windows.html 下载的 GNUStep(有 3 个安装程序 - msys 系统、核心、开发)。
  • 请建议如果我在 mac 上使用 Xcode 或者我需要使用其他东西,这会起作用吗?
  • 我不知道 clang 能否在 Windows 上运行良好。尽管它在 x86 上与 FreeBSD 和 GNU/Linux 等其他一些操作系统确实可以正常工作。您所做的是使用过时的编译器 GCC 不支持的新语法。我会安装 Ubuntu 并检查此页面 wiki.gnustep.org/index.php/ObjC2_FAQ

标签: nsdictionary objective-c-blocks gnustep


【解决方案1】:

您的编译器不支持块。您需要使用现代的clang

真的,如果您学习 Objective-C 的目的是为 Mac 或 iPhone/iPad 编写代码,那么您的第一步需要是购买 Mac 并安装 Xcode。如果您学习使用较旧的编译器,您将错过语言功能,并且您需要重新学习以后使用的模式。

在购买 Mac 之前,请查看 Mountain Lion 的要求。从技术上讲,您可以在 Lion 上运行最新的 Xcode,但我认为 Apple 不会长期保持兼容。

或者,如果您只是想学习 Objective-C,则需要弄清楚您可以使用该语言的哪个子集。不过,我认为这在 iOS/Mac 开发之外并不是非常有用。

【讨论】:

  • 而且 Windows 上的 CLANG+LLVM+ObjC 运行时似乎甚至没有得到积极维护。
  • 即使有人会尝试,它也几乎不会被使用,以至于不可靠。 Objective-C 在 OSX/iOS 之外没有那么有用。
  • 我喜欢在 Mac 上使用 XCode,但我尝试在 Linux 上使用 GnuStep 和 GCC 和 Objective-C 并没有什么乐趣,而且我想在 Windows 上会有更尖锐的锯齿状边缘,其中 GnuStep 和 Objective-C 是鲜为人知且使用最少的。
  • 或者您只需使用 Ubuntu LiveCD 和拇指驱动器。如果您真的知道如何使用 ObjC,那么它在 OSX 之外很有用。例如,Apportable 使用 Cocotron 和 GNUstep,并允许您从 iOS 移植 ObjC 游戏或在 Android 操作系统上构建自己的游戏。您不能在 Mac 之外使用任何语言的子集。它是框架的子集,而不是语言。
  • 这是关于目标的,真的。如果你的目标只是学习 Objective-C,你可以在任何地方学习。如果你的目标是学习现代的 Objective-C,你需要一个现代的 Objective-C 编译器和一个支持它的运行时。如果您的目标是编写应用程序,那么您需要可以编写应用程序的框架。如果你真的知道你在做什么,你可以移植你需要的东西。但我认为,无论如何,真正确定用户的目标是第一步。 :)
猜你喜欢
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多