2017-03-20 6 views
0

私は中国のiOSプログラマーです。私はこの質問の正確なタイトルを作ることはできませんが、申し訳ありませんが、詳細を記述しようとします。タイトルを変更する手助けをすることができる人がいれば、とても感謝しています。私の悪い英語を申し訳ありません。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の位置と同じです。もしあなたが一つのポインタを持っていれば、他のものへのポインタとして扱うことができます。