2011-01-13 2 views
4

아래 코드를 참조하여 블록을 배열에 넣으면 어떻게 블록 객체를 가져 와서 블록의 실제 코드를 실행할 수 있습니까?Objective-C Blocks - 객체로 사용

또 다른 질문 : 아래와 같은 블록에서 메서드를 호출하면 해당 블록이 해당 메서드의 코드를 캡슐화하거나 메서드의 서명을 캡처하여 호출합니다. 이 같은

-(void)blockCalledMethod 
{ 
    NSLog(@"Hello World"); 
} 

-(void)programStart 
{  

    NSArray * array = [[NSArray alloc] initWithObjects:[[^ { [self blockCalledMethod];} copy] autorelease],nil];  

    id pointerToBlock = [array lastObject]; 
} 

답변

7

전화를 : 당신이 직접 호출 할 경우 컴파일러는 를 블록 형태로 인식해야하고 단지 때문에

void (^pointerToBlock)(void) = [array lastObject]; 
pointerToBlock(); // because^{} is void(^)(void) 

당신은, id으로 pointerToBlock을 선언 할 수 없습니다 개체입니다.

위와 같은 블록에서 메서드를 호출하면 해당 블록이 해당 메서드에서 코드를 캡슐화하거나 메서드의 서명을 캡처하여 호출합니다.

self은 호출 클래스를 참조해야합니다.

+0

@BoltClock, 나는 또한'^ {}'이'nil'과 같지 않으므로 당신이 그것의 존재를 테스트 할 수 없다고 생각합니다. 맞습니까? 'if (pointerToBlock)'에 문제가 있습니까? 블록은 컨테이너에 저장되어 처리 될 수 있지만 NSObject의 서브 클래스가 아닙니까? –

+0

@Stephen Furlani : 서명으로'^ {}'을 언급하고 있었지만, 블록은 블록 (nil)과 같지 않습니다. 귀하의 두 번째 질문에, 나는'[^ {} isKindOfClass : [NSObject class]]'를 시도하고 (놀랍게도)'YES'를 반환합니다. – BoltClock

+1

'if (pointerToBlock)'가 잘 동작해야합니다. 사실,'pointerToBlock'이 NULL (nil과 같은 것)이라면,'pointerToBlock()'을 수행하면 무효 객체를 전달하는 것과는 달리 충돌이 발생합니다. 따라서 블록을 호출하기 전에이 검사를하고 싶을 것입니다 NULL 일 수 있습니다. –