2014-04-25 45 views
0

可有人請向我解釋,我需要分離出的聲明和塊的定義,就像如下:塊聲明和定義是混亂的iOS

#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 
} 
+0

你的目標是從一個方法,其中塊具有一個typedef返回塊? – Wain

+0

不僅僅是在課程開始時聲明它並在課程結束時定義。就像c中的函數 –

回答

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!" 

我建議你在t中讀Declaring and Creating Blocks他阻止編程主題。

+0

對不起,它不是實際代碼中的類型錯誤。它給出了同樣的錯誤。 –

+0

我試過了,它沒有錯誤。你的頭文件是什麼樣的?您看到的重定義錯誤讓我相信您已經在其他地方定義了myBlock。 – nebs

+0

感謝您的解決方案。這也適用於我。但是我需要在方法之外聲明和定義。在你的代碼中你也用相同的方法聲明和定義。 –

0

someVar = someValue;是一個賦值語句。在C中的函數之外不允許聲明。只有定義被允許在函數之外。因此這是一個語法錯誤。

int foo; 
foo = 5; 

同樣的功能之外無效。

你真正想要做的是初始化變量定義它的時候:

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