Block

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        int a = 10;
        void(^block)() = ^{
            NSLog(@"%d",a);
        };
        
        a = 20;
        block();
        
    }
    return 0;
}
//編譯后如下:(clang -rewrite-objc  main.m)

struct __main_block_impl_0 {
  struct __block_impl impl;        //__block_impl  isa,Flags,FunPtr
  struct __main_block_desc_0* Desc;
  int a;
  __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _a, int flags=0) : a(_a) {
    impl.isa = &_NSConcreteStackBlock;
    impl.Flags = flags;
    impl.FuncPtr = fp;
    Desc = desc;
  }
};
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
  int a = __cself->a; // bound by copy

            NSLog((NSString *)&__NSConstantStringImpl__var_folders_gw_h9qp96015ds8c2bdsbg65x880000gn_T_main_bb56b8_mi_0,a);
        }

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, const char * argv[]) {
    /* @autoreleasepool */ { __AtAutoreleasePool __autoreleasepool; 

        int a = 10;
        void(*block)() = ((void (*)())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, a));
  
//void(*block)()  函數(shù)指針
//(void (*)()  進行類型轉(zhuǎn)換
//__main_block_impl_0   是一個函數(shù),有三個參數(shù)夯尽,  可以搜一下它是一個結(jié)構(gòu)體典鸡,c++中的結(jié)構(gòu)體相當(dāng)于OC的類
//__main_block_func_0   block{}內(nèi)部的實現(xiàn)  也是一個函數(shù)
//a 
        a = 20;
        ((void (*)(__block_impl *))((__block_impl *)block)->FuncPtr)((__block_impl *)block);

    }
    return 0;
}```



int main(int argc, const char * argv[]) {
@autoreleasepool {

    __block int a = 10;
    void(^block)() = ^{
        NSLog(@"%d",a);
    };
    
    a = 20;
    block();
    
}
return 0;

}
//編譯后如下:

struct __Block_byref_a_0 {
void *__isa;
__Block_byref_a_0 *__forwarding;
int __flags;
int __size;
int a;
};

struct __main_block_impl_0 {
struct __block_impl impl;
struct __main_block_desc_0* Desc;
__Block_byref_a_0 *a; // by ref
__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, __Block_byref_a_0 *_a, int flags=0) : a(_a->__forwarding) {
impl.isa = &_NSConcreteStackBlock;
impl.Flags = flags;
impl.FuncPtr = fp;
Desc = desc;
}
};
static void __main_block_func_0(struct __main_block_impl_0 *__cself) {
__Block_byref_a_0 *a = __cself->a; // bound by ref

        NSLog((NSString *)&__NSConstantStringImpl__var_folders_gw_h9qp96015ds8c2bdsbg65x880000gn_T_main_5caff8_mi_0,(a->__forwarding->a));
    }

static void __main_block_copy_0(struct __main_block_impl_0dst, struct __main_block_impl_0src) {_Block_object_assign((void)&dst->a, (void)src->a, 8/BLOCK_FIELD_IS_BYREF/);}

static void __main_block_dispose_0(struct __main_block_impl_0src) {_Block_object_dispose((void)src->a, 8/BLOCK_FIELD_IS_BYREF/);}

static struct __main_block_desc_0 {
size_t reserved;
size_t Block_size;
void (copy)(struct __main_block_impl_0, struct __main_block_impl_0);
void (
dispose)(struct __main_block_impl_0);
} __main_block_desc_0_DATA = { 0, sizeof(struct __main_block_impl_0), __main_block_copy_0, __main_block_dispose_0};
int main(int argc, const char * argv[]) {
/
@autoreleasepool */ { __AtAutoreleasePool __autoreleasepool;

    __attribute__((__blocks__(byref))) __Block_byref_a_0 a = {(void*)0,(__Block_byref_a_0 *)&a, 0, sizeof(__Block_byref_a_0), 10};

//相比沒有__block 的多出一個__Block_byref_a_0
void(block)() = ((void ()())&__main_block_impl_0((void *)__main_block_func_0, &__main_block_desc_0_DATA, (__Block_byref_a_0 *)&a, 570425344));

//傳值有一處不同 (__Block_byref_a_0 *)&a 傳的是結(jié)構(gòu)體的地址

    (a.__forwarding->a) = 20;

//(a.__forwarding->a) 通過地址修改a的值
((void (*)(__block_impl *))((__block_impl *)block)->FuncPtr)((__block_impl *)block);

}
return 0;

}```

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末署浩,一起剝皮案震驚了整個濱河市畔规,隨后出現(xiàn)的幾起案子棠涮,更是在濱河造成了極大的恐慌箫老,老刑警劉巖昔榴,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異穆碎,居然都是意外死亡牙勘,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門所禀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來方面,“玉大人,你說我怎么就攤上這事色徘」Ы穑” “怎么了?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵褂策,是天一觀的道長横腿。 經(jīng)常有香客問我,道長斤寂,這世上最難降的妖魔是什么耿焊? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮遍搞,結(jié)果婚禮上罗侯,老公的妹妹穿的比我還像新娘。我一直安慰自己溪猿,他們只是感情好钩杰,可當(dāng)我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布纫塌。 她就那樣靜靜地躺著,像睡著了一般讲弄。 火紅的嫁衣襯著肌膚如雪措左。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天避除,我揣著相機與錄音怎披,去河邊找鬼。 笑死驹饺,一個胖子當(dāng)著我的面吹牛钳枕,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赏壹,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼衔沼!你這毒婦竟也來了蝌借?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤指蚁,失蹤者是張志新(化名)和其女友劉穎菩佑,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體凝化,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡稍坯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了搓劫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞧哟。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖枪向,靈堂內(nèi)的尸體忽然破棺而出勤揩,到底是詐尸還是另有隱情,我是刑警寧澤秘蛔,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布陨亡,位于F島的核電站,受9級特大地震影響深员,放射性物質(zhì)發(fā)生泄漏负蠕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一倦畅、第九天 我趴在偏房一處隱蔽的房頂上張望遮糖。 院中可真熱鬧,春花似錦滔迈、人聲如沸止吁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敬惦。三九已至盼理,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間俄删,已是汗流浹背宏怔。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留畴椰,地道東北人臊诊。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像斜脂,于是被迫代替她去往敵國和親抓艳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,666評論 2 350

推薦閱讀更多精彩內(nèi)容