2017-03-20 14 views
0

저는 중국 출신의 프로그래머입니다.이 질문에 대한 정확한 제목을 만들 수 없으므로 죄송합니다. 자세한 내용을 설명하려고합니다. 제목을 바꾸는 데 도움을 줄 수있는 사람이 있다면 정말 감사드립니다. 내 하찮은 영어 실력에 죄송하다는 말씀을 드리고 싶습니다.Objective-C 블록 리터럴 구문 원칙

블록 구문에 대한 소스 코드를 보려면 clang -rewrite-objc을 사용할 때 이해할 수없는 것을 발견했습니다. 여기 내 코드입니다 :

int main(int argc, char *argv[]) { 
    void (^blk)() =^{ 
    }; 
    blk(); 
} 

그리고 핵심 소스 코드는 메인 함수에서

struct __block_impl { 
    void *isa; 
    int Flags; 
    int Reserved; 
    void *FuncPtr; 
}; 

struct __main_block_impl_0 { 
    struct __block_impl impl; 
    struct __main_block_desc_0* Desc; 
    __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) { 
    impl.isa = &_NSConcreteStackBlock; 
    impl.Flags = flags; 
    impl.FuncPtr = fp; 
    Desc = desc; 
    } 
}; 

static void __main_block_func_0(struct __main_block_impl_0 *__cself) { 

} 

static struct __main_block_desc_0 { 
    size_t reserved; 
    size_t Block_size; 
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0)}; 

int main(int argc, char *argv[]) { 
void (*blk)() = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA)); 
((void (*)(__block_impl *))((__block_impl *)blk)->FuncPtr)((__block_impl *)blk); 
} 

되어 나는 BLK(), 소스 코드 캐스트 BLK를 호출하고이 코드에 의해 FuncPtr을 때

((__block_impl *)blk)->FuncPtr) 

나는 그것을 실제로 이해할 수 없다. 제 생각에는,이 코드의 원리를 이해하는 데 도움 수있는 사람이 있다면, 난 정말 C++에 대한 자세한 내용을 알고하지 않습니다

(((__main_block_impl_0 *)blk ->impl).FuncPtr) 

를 사용하는 것을 선호, 나는 매우 감사 할 것입니다. 너희들 주셔서 고마워.

답변

1

음, struct __main_block_impl_0의 첫 번째 멤버 (impl)는 struct __block_impl입니다. 따라서 struct __main_block_impl_0의 위치는 첫 번째 구성원 인 struct __block_impl의 위치와 같습니다. 하나에 대한 포인터가 있으면 다른 포인터에 대한 포인터로 처리 할 수 ​​있습니다.