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];
}
@BoltClock, 나는 또한'^ {}'이'nil'과 같지 않으므로 당신이 그것의 존재를 테스트 할 수 없다고 생각합니다. 맞습니까? 'if (pointerToBlock)'에 문제가 있습니까? 블록은 컨테이너에 저장되어 처리 될 수 있지만 NSObject의 서브 클래스가 아닙니까? –
@Stephen Furlani : 서명으로'^ {}'을 언급하고 있었지만, 블록은 블록 (nil)과 같지 않습니다. 귀하의 두 번째 질문에, 나는'[^ {} isKindOfClass : [NSObject class]]'를 시도하고 (놀랍게도)'YES'를 반환합니다. – BoltClock
'if (pointerToBlock)'가 잘 동작해야합니다. 사실,'pointerToBlock'이 NULL (nil과 같은 것)이라면,'pointerToBlock()'을 수행하면 무효 객체를 전달하는 것과는 달리 충돌이 발생합니다. 따라서 블록을 호출하기 전에이 검사를하고 싶을 것입니다 NULL 일 수 있습니다. –