iOS块,如何在不同的实现文件中使用

时间:2013-12-13 09:12:35

标签: ios block

我正在尝试为我的应用程序创建一些可重用的块。

CommonBlocks.h

void (^testBlock)(int) = ^(int number) {
  // do nothing for now;  
};

VariousImplementationFile.m

#import "CommonBlocks.h"

(void)setup {
   testBlock(5);
 }

不幸的是,当我尝试将此代码推送到iOS设备时,我收到错误:链接器命令失败,退出代码为1(使用-v查看调用)。好像我错过了一些。

有什么建议吗?

由于

3 个答案:

答案 0 :(得分:1)

您尝试在声明之前添加static关键字:

static void (^testBlock)(int) = ^(int number) {
  // do nothing for now;  
};

您的代码会导致错误,因为您在.h头文件中声明了非静态变量testBlock。

当你在VariousImplementationFile.m中调用#import "CommonBlocks.h"时,testBlock被声明一次。然后你在其他地方导入CommonBlocks.h,再次声明testBlock,这样你就会得到符号重复错误。

答案 1 :(得分:0)

以这种方式在CommonBlocks.h中声明阻止

typedef void (^RCCompleteBlockWithResult)  (BOOL result, NSError *error);

然后你可以在任何方法中使用,例如:

 -(void)getConversationFromServer:(NSInteger)placeId completionBlock:(RCCompleteBlockWithResult)completionBlock

答案 2 :(得分:-1)

这不是特定于块的。基本上,您想知道如何使用可从多个文件访问的全局变量。

基本上,问题在于,在C中,每个“符号”只能被“定义”一次(它可以多次“声明”,但只能“定义”一次)。因此,您不能将符号的“定义”放在头文件中,因为它将包含在多个源文件中,因此有效地,相同的符号将被多次“定义”。

对于函数,原型是声明,而代码的实现是定义。由于这个原因,您无法在头文件中实现函数。对于常规变量,写入变量的名称和类型就是定义它。要仅“声明”它,您需要使用extern

值得一提的是staticstatic为特定源文件创建一个本地变量。这样,它的名称不会干扰其他地方具有相同名称的变量。您可以使用它来创建对特定文件“私有”的全局变量。然而,这不是你要求的 - 你要求的恰恰相反 - 一个“公共”的变量,即在文件之间共享。

这样做的标准方法是:

<强> CommonBlocks.h

extern void (^testBlock)(int); // any file can include the declaration

<强> CommonBlocks.m

// but it's only defined in one source file
void (^testBlock)(int) = ^(int number) {
  // do nothing for now;  
};