【问题标题】:Objective-C Blocks ErrorObjective-C 块错误
【发布时间】:2014-02-09 16:40:37
【问题描述】:

我刚开始学习 Objective-C。尝试制作非常小的 Objective-c Block 示例时出现错误。它总是显示“expected identifier or '(' before '^' token”错误?。你能告诉我我哪里做错了吗?

#import <Foundation/Foundation.h>

@interface Block:NSObject
 - (void) printAdd;
@end

@implementation Block   
    void (^addition) (int, int)  =  ^(int left, int right) {
        NSLog(@"Total is: %d\n", left + right); 
    };

  -(void) printAdd {
       NSLog(@"Test");
        addition(12, 13);
    }
@end

int main() {
      Block* myBlock = [[Block alloc] init];
      [myBlock printAdd];
      return 0;
}

【问题讨论】:

    标签: objective-c gcc objective-c-blocks gnustep


    【解决方案1】:

    “官方”的 GCC 不支持 Objective-C 块,比较 Are Objective-C blocks supported by compilers on Linux?,所以你应该使用 clang。您还需要 clang 来利用其他 Objective-C 的特性,比如“自动引用计数”。


    旧答案:这是有效的 Objective-C 代码。

    我的猜测:您将其编译为 C 程序 (main.c)。将源文件重命名为 main.m 应该能解决问题。

    请注意,一般来说,Objective-C/Foundation 程序的main() 应该建立一个 “自动释放池”:

    int main(int argc, const char * argv[])
    {
        @autoreleasepool {
          Block* myBlock = [[Block alloc] init];
          [myBlock printAdd];
        }
        return 0;
    }
    

    如果您在 Xcode 中创建一个新的“命令行工具”并选择 “类型 = 基础”。

    【讨论】:

    • :( 无法解决问题
    • @Binngokute:我在 Xcode 中使用“命令行工具”模板创建了一个新项目,使用“Type = Foundation”,并将您的代码复制到 main.m。编译没有问题。
    • @Binngokute:你使用哪个编译器? gcc 还是 clang? gcc 不支持块,比较stackoverflow.com/a/4645370/1187415.
    • gcc,没有多少文件说 gcc 不支持块。非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2012-11-20
    相关资源
    最近更新 更多