2012-06-19 37 views
13

Vì vậy, tôi đang cố chuyển một khối như một tham số NSAlertcontextInfo.Làm thế nào để bỏ các khối vào và ra khỏi khoảng trống *

[myAlert beginSheetModalForWindow: theWindow 
        modalDelegate: myAlert 
        didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:) 
         contextInfo: (void *) aBlock]; 

và làm cho nó trở lại ở đầu bên kia:

void (^responseBlock)() = (__bridge_transfer void (^)()) contextInfo; 

Những công trình, đến một mức độ nào đó. Trước khi tôi gọi tới số beginSheetModalForWindow:... aBlock tại số 0x00007fff610e1ec0 và trả lời (alertDidEnd:...), contextInfo là 0x00007fff610e1ec0.

Tuy nhiên, khi tôi cố gắng gọi khối:

responseBlock(); 

tôi nhận được lỗi sau

error: called object type '__block_literal_generic *' is not a function or function pointer
error: 1 errors parsing expression

Làm sao người ta đúc đúng khối để một từ void * s vì lợi ích của chuyển giao đơn giản ?

Chỉnh sửa: Mã đầy thử, sử dụng phương pháp truyền được đề xuất trong câu trả lời. Bây giờ tôi nhận được lỗi EXC_BAD_ACCESS trong cuộc gọi responseBlock();.

- (void)alertDidEnd:(NSAlert *)alert returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo 
{ 
    void (^responseBlock)() = (__bridge typeof(responseBlock)) contextInfo; 

    switch (returnCode) 
    { 
     case NSCancelButton: 
     { 
      break; 
     } 

     case NSOKButton: 
     { 
      responseBlock(); 
      break; 
     } 
    } 
} 

Ghi chú khác: Khi sử dụng __bridge, địa chỉ bộ nhớ của responseBlockcontextInfo là khác nhau, trong khi với __bridge_transfer, họ đều giống nhau. Không làm giảm bớt vấn đề EXC_BAD_ACCESS.

LÀM VIỆC:

[myAlert beginSheetModalForWindow: theWindow 
        modalDelegate: myAlert 
        didEndSelector: @selector(alertDidEnd:returnCode:contextInfo:) 
         contextInfo: (__bridge_retained void *) [aBlock copy]]; 

và sau đó ...

void (^responseBlock)() = (__bridge_transfer typeof(responseBlock)) contextInfo; 
+0

Tôi có một câu trả lời, nhưng tôi không thể tái tạo vấn đề của bạn. Tôi tự hỏi tại sao đó là ... bạn có bất kỳ cảnh báo/biên dịch thêm nào không? –

Trả lời

6

Dưới đây là một ví dụ nhỏ. Tôi nghĩ rằng vấn đề với mã của bạn là bạn đang cố gắng sử dụng __bridge_transfer với một void * mà không phải là bộ nhớ được quản lý với ARC:

void takesBlock(void *asPointer) 
{ 
    void (^asBlock)() = (__bridge typeof asBlock) asPointer; 

    asBlock(); 
} 

int main() 
{ 
    @autoreleasepool { 
     takesBlock((__bridge void *)[^{ 
      NSLog(@"Hello World!"); 
     } copy]); 
    } 
} 
+0

'void (^ responseBlock)() = (__bridge typeof responseBlock) contextInfo;' cung cấp cho tôi lỗi cú pháp: 'Expected ')'' trên 'responseBlock' trong' typeof responseBlock'. Suy nghĩ? –

+0

@pcperini bạn có thể đăng nội dung của hàm vào thùng dán không? –

+0

Đã thêm chức năng đầy đủ vào câu hỏi. Lỗi đã thay đổi từ lỗi loại thành EXC_BAD_ACCESS đầy đủ. –

Các vấn đề liên quan