亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

block解析-形參變量

2019-11-14 20:10:22
字體:
來源:轉載
供稿:網友

block形參

之前漏了一篇block形參的介紹,這里給補上。

block形參就是定義block帶的參數,和函數的參數使用一樣,我們可以在block隨意使用修改block形參。

我們來看個例子:

我們聲明了兩個NSString 指針_p1 _p2、int 型_p3、可變數組_p4,并把這些參數傳入block,在block內修改。

-(void )test3{    NSString *_p1=[NSString stringWithFormat:@"hello %@",@"world11"];    NSString *_p2=[NSString stringWithFormat:@"hello %@",@"world12"];    int _p3=1;    NSMutableArray *_p4=[[NSMutableArray alloc]init];    //初始值    NSLog(@"init p1:%@,%p,%p",_p1,_p1,&_p1);    NSLog(@"init p2:%@,%p,%p",_p2,_p2,&_p2);    NSLog(@"init p3:%d,%p",_p3,&_p3);    NSLog(@"init p4:%@,%p,%p",_p4,_p4,&_p4);    void (^myBlock)(NSString *,NSString **,int,NSMutableArray *) = ^(NSString *p1,NSString **p2,int p3,NSMutableArray * p4) {        //block內賦值        p1=@"21";        *p2=@"22";        p3=23;        [p4 addObject:@"23"];        NSLog(@"excuteing p1:%@,%p,%p",p1,p1,&p1);        NSLog(@"excuteing p2:%@,%p,%p,%p",*p2,*p2,p2,&p2);        NSLog(@"excuteing p3:%d,%p",p3,&p3);        NSLog(@"excuteing p4:%@,%p,%p",p4,p4,&p4);    };    myBlock(_p1,&_p2,_p3,_p4);    //block執行后    NSLog(@"excuteafter p1:%@,%p,%p",_p1,_p1,&_p1);    NSLog(@"excuteafter p2:%@,%p,%p",_p2,_p2,&_p2);    NSLog(@"excuteafter p3:%d,%p",_p3,&_p3);    NSLog(@"excuteafter p4:%@,%p,%p",_p4,_p4,&_p4);}

 

輸出日志:

2014-07-31 14:17:06.774 Test[3655:60b] init p1:hello world11,0x16537b20,0x27df89902014-07-31 14:17:06.776 Test[3655:60b] init p2:hello world12,0x1652d760,0x27df898c2014-07-31 14:17:06.778 Test[3655:60b] init p3:1,0x27df89882014-07-31 14:17:06.779 Test[3655:60b] init p4:(),0x1652b6d0,0x27df89842014-07-31 14:17:06.781 Test[3655:60b] excuteing p1:21,0x11a08,0x27df893c2014-07-31 14:17:06.782 Test[3655:60b] excuteing p2:22,0x11a18,0x27df897c,0x27df89382014-07-31 14:17:06.783 Test[3655:60b] excuteing p3:23,0x27df89342014-07-31 14:17:06.784 Test[3655:60b] excuteing p4:(    23),0x1652b6d0,0x27df89302014-07-31 14:17:06.785 Test[3655:60b] excuteafter p1:hello world11,0x16537b20,0x27df89902014-07-31 14:17:06.786 Test[3655:60b] excuteafter p2:22,0x11a18,0x27df898c2014-07-31 14:17:06.787 Test[3655:60b] excuteafter p3:1,0x27df89882014-07-31 14:17:06.788 Test[3655:60b] excuteafter p4:(    23),0x1652b6d0,0x27df8984

從日志可以看出:

  • 我們把指針_p1(NSString *)傳入block,傳參數的過程其實可以理解為用新的指針指向  _p1所指向的內存地址。這時候在block內部修改指針指向,只是修改了block形參的指針的指向,所以block內部p1的內容和block外部_p1的不一樣。
  • 我們把指針_p4(NSMutableArray *)傳入block,傳參數的過程和上面一樣,用了一個新的指針指向  參數所指向的內存地址,在block內部對 形參指針指向的內存進行修改,即操作的是同一片內存,所以能同步到block外部。
  • 我們把指針_p2(NSString **)傳到了block內部,傳遞的是指針的地址,我們在block內部修改*p2,其實是修改 指針p2 指向的指針  指向的內存地址,也能同步到block外部。
  • 因為_p3是值傳遞,所以block內部修改不會影響外部,這個和函數一樣。

 

我們來看看block對行參變量的處理:

這是block結構體,并沒有生成成員 對形參進行引用

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

我們看block實現的函數,對變量的訪問,都是通過形參來實現的,并沒有通過結構體的成員

static void __KDBlockTest__test3_block_func_0(struct __KDBlockTest__test3_block_impl_0 *__cself, NSString *p1, NSString **p2, int p3, NSMutableArray *p4) {        p1=(NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_9;        *p2=(NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_10;        p3=23;        ((void (*)(id, SEL, id))(void *)objc_msgSend)((id)p4, sel_registerName("addObject:"), (id)(NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_11);        NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_12,p1,p1,&p1);        NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_13,*p2,*p2,p2,&p2);        NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_14,p3,&p3);        NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_15,p4,p4,&p4);    }

下面是我們的測試函數,看紅色部分,是通過函數參數傳遞,和函數調用一樣,和block內使用局部變量、靜態變量、成員變量還是有很大區別的,并沒有截獲變量。

static void _I_KDBlockTest_test3(KDBlockTest * self, SEL _cmd) {    NSString *_p1=((NSString *(*)(id, SEL, NSString *, ...))(void *)objc_msgSend)((id)objc_getClass("NSString"), sel_registerName("stringWithFormat:"), (NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_1, (NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_2);    NSString *_p2=((NSString *(*)(id, SEL, NSString *, ...))(void *)objc_msgSend)((id)objc_getClass("NSString"), sel_registerName("stringWithFormat:"), (NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_3, (NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_4);    int _p3=1;    NSMutableArray *_p4=((id (*)(id, SEL))(void *)objc_msgSend)((id)((id (*)(id, SEL))(void *)objc_msgSend)((id)objc_getClass("NSMutableArray"), sel_registerName("alloc")), sel_registerName("init"));    NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_5,_p1,_p1,&_p1);    NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_6,_p2,_p2,&_p2);    NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_7,_p3,&_p3);    NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_8,_p4,_p4,&_p4);    void (*myBlock)(NSString *,NSString **,int,NSMutableArray *) = (void (*)(NSString *, NSString **, int, NSMutableArray *))&__KDBlockTest__test3_block_impl_0((void *)__KDBlockTest__test3_block_func_0, &__KDBlockTest__test3_block_desc_0_DATA);    ((void (*)(__block_impl *, NSString *, NSString **, int, NSMutableArray *))((__block_impl *)myBlock)->FuncPtr)((__block_impl *)myBlock, _p1, &_p2, _p3, _p4);//block 執行    NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_16,_p1,_p1,&_p1);    NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_17,_p2,_p2,&_p2);    NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_18,_p3,&_p3);    NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_19,_p4,_p4,&_p4);}

 

總結:

  • 對于block形參,block不會對形參、實參強引用,調用是通過參數傳遞實現的(block結構體內部沒有成員引用)
  • 和函數調用一樣,block內部可以修改形參,并且影響到實參。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品免费视频| 国产精品视频不卡| 日韩精品免费综合视频在线播放| 久久久久亚洲精品国产| 91国语精品自产拍在线观看性色| 成人免费淫片aa视频免费| 国产精品18久久久久久麻辣| 亚洲免费高清视频| 欧美大片网站在线观看| 国产精品免费久久久久影院| 亚洲女同性videos| 亚洲成人a**站| 欧美精品电影在线| 日韩有码在线电影| 在线看片第一页欧美| 久久综合国产精品台湾中文娱乐网| 色yeye香蕉凹凸一区二区av| 亚洲免费视频网站| 色综合天天狠天天透天天伊人| 国产mv免费观看入口亚洲| 91九色在线视频| 26uuu日韩精品一区二区| 欧美亚洲另类视频| 久久免费视频在线| 综合欧美国产视频二区| 国产精品久久久久久久久借妻| 成人做爽爽免费视频| 97国产精品视频| 国模吧一区二区三区| 日韩欧美国产高清91| 91精品久久久久久久久不口人| 亚洲午夜av电影| 久久久久久久影视| 国产精品高潮呻吟久久av无限| 国产精品扒开腿做爽爽爽视频| 中文字幕一区日韩电影| 成人妇女淫片aaaa视频| 亚洲天堂av在线播放| 国产精品成人品| 国产精品视频公开费视频| 日韩美女在线播放| 日韩高清电影免费观看完整版| 欧美日韩亚洲视频| 韩剧1988在线观看免费完整版| 亚洲图片制服诱惑| 久久视频在线直播| 久久精品夜夜夜夜夜久久| 91久久国产精品91久久性色| 成人久久18免费网站图片| 国产精品久久久久久久久男| 丰满岳妇乱一区二区三区| 久久综合色影院| 中文字幕久久久av一区| 亚洲另类xxxx| 91免费在线视频网站| 国产一区二区三区在线播放免费观看| 欧美大片在线看免费观看| 国产一区av在线| 日本在线精品视频| 91日韩在线播放| 亚洲成人亚洲激情| 久热国产精品视频| 久久精品99久久久香蕉| 欧美激情一区二区久久久| 亚洲一区亚洲二区| 国产精品视频导航| 欧美激情免费看| 欧美电影在线观看网站| 亚洲日韩中文字幕在线播放| 欧美大全免费观看电视剧大泉洋| 热久久这里只有精品| 国产成人av网址| 国产成人短视频| 中文字幕精品一区二区精品| 欧美尤物巨大精品爽| 欧美xxxx做受欧美.88| 精品中文字幕在线2019| 91精品国产高清久久久久久久久| 国产精品人成电影在线观看| 日本免费在线精品| 亚洲美女视频网| 亚洲日本中文字幕| 久久精品小视频| 第一福利永久视频精品| 51色欧美片视频在线观看| 欧美日韩在线免费观看| 日韩av综合中文字幕| 亚洲网站在线播放| 青草热久免费精品视频| 日韩亚洲欧美中文在线| 欧美亚洲在线播放| 欧美大全免费观看电视剧大泉洋| 亚洲人成网站免费播放| 欧美国产亚洲精品久久久8v| 亚洲人午夜精品| 成人欧美一区二区三区黑人孕妇| 日韩av中文字幕在线播放| 亚洲成人网在线观看| 国产精品亚洲综合天堂夜夜| 日本成人激情视频| 亚洲第一视频网| 欧美激情国产高清| 中文字幕v亚洲ⅴv天堂| 久久国产精品网站| 国产亚洲欧美日韩精品| 美女福利精品视频| 亚洲性生活视频在线观看| 性欧美办公室18xxxxhd| 亚洲欧洲美洲在线综合| 国产亚洲精品高潮| 久久久免费观看| 亚洲在线第一页| 亚洲精品久久久久久久久久久久久| 欧美精品video| 91久久国产综合久久91精品网站| 日韩毛片在线看| 国产丝袜精品第一页| 色婷婷久久一区二区| 国产精品影片在线观看| www国产精品视频| 国产精品视频xxxx| 亚洲精品永久免费精品| 国产91精品久久久久久| 欧美成人中文字幕在线| 亚洲国产91色在线| 久久人人爽人人爽爽久久| 91精品国产91久久久久久久久| 国产精品久久久久久五月尺| 欧美日韩精品在线观看| 亚洲女人初尝黑人巨大| 欧美成人免费在线观看| 久久欧美在线电影| 国产一区二区三区久久精品| 日韩视频永久免费观看| 伊人av综合网| 久久成年人视频| 欧美高清videos高潮hd| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品久久久久久亚洲影视| 在线观看国产精品淫| 亚洲一区二区三区xxx视频| 国产视频亚洲视频| 精品magnet| 亚洲黄色av网站| 欧美裸体xxxx极品少妇| 欧美洲成人男女午夜视频| 亚洲男人天堂手机在线| 福利二区91精品bt7086| 国产精品wwww| 亚洲性xxxx| 欧美精品在线观看91| 欧美激情在线狂野欧美精品| 亚洲精选中文字幕| 成人黄色大片在线免费观看| 久久久成人精品| 国产成人+综合亚洲+天堂| 中文字幕久热精品在线视频| 国产精品久久不能| 中文国产成人精品| 国产精品无码专区在线观看| 蜜月aⅴ免费一区二区三区| 91av视频导航| 久久免费国产视频| 日韩一级黄色av|