块声明和定义是iOS的混乱

时间:2014-04-25 07:20:54

标签: ios objective-c-blocks

有人可以向我解释一下,我需要将块的声明和定义分开,如下所示:

#import <Foundation/Foundation.h>

// Main method
int main(int argc, const char * argv[])
{
    @autoreleasepool {       
       NSLog(@"Hello, World!");            
    }
}

// Working fine. This code is working fine 
- (void) blockSample{

    (void) (^myBLock) (id sender);

    myBlock = ^(id sender){    // It working fine.
        //implementation
    }
    return 0;
}
/* I need it most work like this.*/
// it shows me error
(void) (^myBLock) (id sender);

myBlock = ^(id sender){    // It shows me error of redefinition.
    //implementation
}

2 个答案:

答案 0 :(得分:0)

在函数外部定义变量时需要提供类型。您可以通过首先为块定义类型,或在一行中声明和定义块来实现此目的。

这对我有用:

MyClass.h:

#import <Foundation/Foundation.h>

@interface MyClass : NSObject
- (void)myMethod;
@end

MyClass.m

#import "MyClass.h"

typedef void (^MyBlockType) (id sender);
MyBlockType myBlock = ^(id sender) {
    NSLog(@"It works!");
};

@implementation MyClass
- (void)myMethod {
    myBlock(nil);
}

@end

然后,在其他地方......

MyClass *myClass = [MyClass new];
[myClass myMethod]; // Prints "It works!"

我建议您阅读Blocks Programming Topics中的Declaring and Creating Blocks

答案 1 :(得分:0)

someVar = someValue;是一个赋值语句。 C中的函数不允许使用语句。只允许在函数之外定义。因此,这是一个语法错误。

int foo;
foo = 5;

在功能之外同样无效。

您真正想要做的是在定义变量时初始化变量:

void (^myBLock) (id sender) = ^(id sender) {    // It shows me error of redefinition.
    //implementation
};