可以在Objective-C方法中定义C函数吗?

时间:2012-01-29 16:07:29

标签: objective-c c

我有一个方法,如下:

- (void) simpleMethod {
    var = someValue;
}

我想定义一个仅存在于该方法中的函数(我可以在python中执行此操作)。我试着将它定义为普通的C函数,就像这样......

- (void) simpleMethod {
    var = someValue;
    int times1k(int theVar) {
    return theVar * 1000;
    }
    ivar = times1k(var);
}

但Xcode会抛出各种错误。是否可以在Objective-C中的方法中定义函数?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:16)

不,Objective-C在这类事情上遵循严格的C规则,因此通常不允许嵌套函数。海湾合作委员会通过a language extension允许他们通过Joachim Bengtsson's article,但这个扩展并未转移到Clang和现代工具链。

你可以做的是使用块,这是Python(以及世界上大多数其他地方)调用闭包的Objective-C版本。由于希望保持C的超集,语法有点时髦,但你的例子是:

- (void) simpleMethod {
    var = someValue;

    // if you have a bunch of these, you might like to typedef
    // the block type
    int (^times1k)(int) = ^(int theVar){
    return theVar * 1000;
    };

    // blocks can be called just like functions
    ivar = times1k(var);
}

因为关闭而不是简单的嵌套函数,如果你希望在声明被传递时不希望它们的值被捕获,你需要遵循一些规则来声明变量,但是没有与您的示例相关的,因为您的块是纯粹的功能。另外,times1k是一个理论上可以传递的变量,遵循一些关于内存管理的不寻常规则(或者让ARC编译器为你担心它们)。

首先介绍块,我喜欢{{3}}。