에 목표 - C 블록을 전달하려면 어떻게 성공적으로 매개 변수로 블록을 필요로하는 메소드를 호출하여 다음과 같은 기능이 있습니다 : 수동 objc_msgSend
OBJC_EXPORT
void testsendmsg(void *block)
{
[NSEvent addLocalMonitorForEventsMatchingMask:1024 handler:block];
}
가 지금은 objc_msgSend를 사용하여이 메서드를 호출하는 것을 시도하고있다. 위 함수의 디스 어셈블리를 보면 블록 앞에 파라미터로 추가 "0"을 전달해야한다는 것을 알았습니다. 그로 인해 다음 코드가 작동하는 것으로 보입니다.
OBJC_EXPORT
void testsendmsg(void *block)
{
objc_msgSend(objc_getClass("NSEvent"), sel_getUid("addLocalMonitorForEventsMatchingMask:handler:"), 1024, 0, block);
}
하지만이 "0"의 의미는 무엇입니까? 항상 "0"입니까 아니면 다른 값을 전달해야합니까?
궁극적 인 목표는 addLocalMonitorForEventsMatchingMask:handler
(델파이)입니다. 따라서 (void *block)
을 다른 것으로 변경하거나 handler:^(NSEvent *event){ return nil; };
과 같은 공식 블록 구문을 사용하는 것은 나를위한 옵션이 아닙니다.
RTL은 Macapi.OCBlocks.pas에서이 작업을 수행 할 수 있습니다. 장치가 제공하는 옵션을 사용하거나 GetObjCBlock/FreeBlock 함수를 사용하여 _objcblockcallbackallpointer 프로 시저를 제공 할 수 있습니다. – Giel
이미 해당 장치를 살펴 보았습니다. 그러나 해당 코드를 올바르게 읽으면 GetObjCBlock은 {$ IFDEF CPUARM}이 정의 된 경우에만 구현됩니다. –