여기의 질문은 교육적인 내용입니다. 나는 한 시간 전에 이것을 생각하기 시작했다. 은 레고 블록 (어리석은 것, 나는 알고있다) 주위에 튀기고있다.블록 및 메시징
블록은 내가 이해 한 것으로부터 스택에 만들어진 개체입니다.
하자가 A
말은 우리가 할 수있는 것을 의미 객체입니다 : 블록 객체 인 경우
[A message];
을 그 바탕으로, 우리는 또한 할 수있는 :
[block message];
내가 수정 있습니까 ?
그리고 런타임이 있음을 볼 때, 그것은 부를 것이다 : 이objc_msgSend(block, @selector(message), nil);
그래서 제 질문은, 어떻게 우리가 블록 메시지를 보낼 수 있습니까?
그리고 이것이 가능하다면 블록을 인자로하는 메시지를 블록으로 보내는 것도 가능할 것이라고 생각합니다. 블록의 유사한 서명 void (^)(void)
을 가지고 있기 때문에, 우리는 심지어뿐만 아니라 메시지 (SEL
)와 같은 블록을 만들 수있는 의미
block();
합니까를 우리가 수행하여 블록을 호출 할 수 있다면
그리고, 방법?
이 가능할 것이다 경우 때문에, 그 다음은 정말 나를 놀라게 것입니다 :
objc_msgSend(block, @selector(block), block);
나 :
objc_msgSend(block1, @selector(block2), block3);
내가 내 상상력 야생 비트를 실행하고 나의 이해는 것을하지 않는 희망 여기서 벗어나지 마라.
블록 리터럴에는 'invoke()'함수 포인터가 있습니다. 그들은 호출을위한 objective-c 인터페이스를 필요로하지 않습니다. 즉, 잘 정의 된 호출 메소드의 경우 단순히 인수가 다른 레이아웃 (블럭이'void (^) (void) '일뿐만 아니라)이있는 각 블록 리터럴에 대해 NSBlock의 고유 한 하위 클래스를 만들어야합니다. – CodaFi
이 방법은 컴파일러가 어떤 함수를 생성해야하는지 완벽하게 제어 할 수 있으며 리터럴이 사용될 때 블록이 스택에 간단히 만들어지고 해당 함수 포인터가 할당됩니다. – CodaFi
@CodaFi 미안하지만, 좀 더 자세히 말해 줄 수 있고, 내가 조금 잃어 버렸기 때문에 샘플, 추론 등 좀 더 세부적인 내용을 어떻게 성취 할 수 있는지 보여줄 수 있습니까? 감사. – Unheilig