成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

block 解析 - 形參變量

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

block形參

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

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

我們來看個例子:

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

  1. 復制代碼 
  2.  
  3. -(void )test3 
  4.     NSString *_p1=[NSString stringWithFormat:@"hello %@",@"world11"]; 
  5.     NSString *_p2=[NSString stringWithFormat:@"hello %@",@"world12"]; 
  6.     int _p3=1
  7.     NSMutableArray *_p4=[[NSMutableArray alloc]init]; 
  8.     //初始值 
  9.     NSLog(@"init p1:%@,%p,%p",_p1,_p1,&_p1); 
  10.     NSLog(@"init p2:%@,%p,%p",_p2,_p2,&_p2); 
  11.     NSLog(@"init p3:%d,%p",_p3,&_p3); 
  12.     NSLog(@"init p4:%@,%p,%p",_p4,_p4,&_p4); 
  13.     void (^myBlock)(NSString *,NSString **,int,NSMutableArray *) = ^(NSString *p1,NSString **p2,int p3,NSMutableArray * p4) { 
  14.         //block內賦值 
  15.         p1=@"21"
  16.         *p2=@"22"
  17.         p3=23
  18.         [p4 addObject:@"23"]; 
  19.         NSLog(@"excuteing p1:%@,%p,%p",p1,p1,&p1); 
  20.         NSLog(@"excuteing p2:%@,%p,%p,%p",*p2,*p2,p2,&p2); 
  21.         NSLog(@"excuteing p3:%d,%p",p3,&p3); 
  22.         NSLog(@"excuteing p4:%@,%p,%p",p4,p4,&p4); 
  23.     }; 
  24.     myBlock(_p1,&_p2,_p3,_p4); 
  25.     //block執行后 
  26.     NSLog(@"excuteafter p1:%@,%p,%p",_p1,_p1,&_p1); 
  27.     NSLog(@"excuteafter p2:%@,%p,%p",_p2,_p2,&_p2); 
  28.     NSLog(@"excuteafter p3:%d,%p",_p3,&_p3); 
  29.     NSLog(@"excuteafter p4:%@,%p,%p",_p4,_p4,&_p4); 

輸出日志:

  1. 2014-07-31 14:17:06.774 Test[3655:60b] init p1:hello world11,0x16537b20,0x27df8990 
  2. 2014-07-31 14:17:06.776 Test[3655:60b] init p2:hello world12,0x1652d760,0x27df898c 
  3. 2014-07-31 14:17:06.778 Test[3655:60b] init p3:1,0x27df8988 
  4. 2014-07-31 14:17:06.779 Test[3655:60b] init p4:( 
  5. ),0x1652b6d0,0x27df8984 
  6. 2014-07-31 14:17:06.781 Test[3655:60b] excuteing p1:21,0x11a08,0x27df893c 
  7. 2014-07-31 14:17:06.782 Test[3655:60b] excuteing p2:22,0x11a18,0x27df897c,0x27df8938 
  8. 2014-07-31 14:17:06.783 Test[3655:60b] excuteing p3:23,0x27df8934 
  9. 2014-07-31 14:17:06.784 Test[3655:60b] excuteing p4:( 
  10.     23 
  11. ),0x1652b6d0,0x27df8930 
  12. 2014-07-31 14:17:06.785 Test[3655:60b] excuteafter p1:hello world11,0x16537b20,0x27df8990 
  13. 2014-07-31 14:17:06.786 Test[3655:60b] excuteafter p2:22,0x11a18,0x27df898c 
  14. 2014-07-31 14:17:06.787 Test[3655:60b] excuteafter p3:1,0x27df8988 
  15. 2014-07-31 14:17:06.788 Test[3655:60b] excuteafter p4:( 
  16.     23 
  17. ),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結構體,并沒有生成成員 對形參進行引用

  1. struct __KDBlockTest__test3_block_impl_0 { 
  2.   struct __block_impl impl; 
  3.   struct __KDBlockTest__test3_block_desc_0* Desc; 
  4.   __KDBlockTest__test3_block_impl_0(void *fp, struct __KDBlockTest__test3_block_desc_0 *desc, int flags=0) { 
  5.     impl.isa = &_NSConcreteStackBlock; 
  6.     impl.Flags = flags; 
  7.     impl.FuncPtr = fp; 
  8.     Desc = desc; 
  9.   } 
  10. }; 

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

  1. static void __KDBlockTest__test3_block_func_0(struct __KDBlockTest__test3_block_impl_0 *__cself, NSString *p1, NSString **p2, int p3, NSMutableArray *p4) { 
  2.  
  3.  
  4.         p1=(NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_9; 
  5.         *p2=(NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_10; 
  6.         p3=23
  7.         ((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); 
  8.         NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_12,p1,p1,&p1); 
  9.         NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_13,*p2,*p2,p2,&p2); 
  10.         NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_14,p3,&p3); 
  11.         NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_15,p4,p4,&p4); 
  12.     } 

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

  1. static void _I_KDBlockTest_test3(KDBlockTest * self, SEL _cmd) { 
  2.     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); 
  3.     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); 
  4.     int _p3=1
  5.     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")); 
  6.  
  7.     NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_5,_p1,_p1,&_p1); 
  8.     NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_6,_p2,_p2,&_p2); 
  9.     NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_7,_p3,&_p3); 
  10.     NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_8,_p4,_p4,&_p4); 
  11.     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); 
  12.     ((void (*)(__block_impl *, NSString *, NSString **, int, NSMutableArray *))((__block_impl *)myBlock)->FuncPtr)((__block_impl *)myBlock, _p1, &_p2, _p3, _p4);//block 執行 
  13.  
  14.     NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_16,_p1,_p1,&_p1); 
  15.     NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_17,_p2,_p2,&_p2); 
  16.     NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_18,_p3,&_p3); 
  17.     NSLog((NSString *)&__NSConstantStringImpl__var_folders_5l_2l25j3tn0wl_3zy1hpsq1rhc0000gp_T_KDBlockTest_654672_mi_19,_p4,_p4,&_p4); 

總結:

對于block形參,block不會對形參、實參強引用,調用是通過參數傳遞實現的(block結構體內部沒有成員引用)

和函數調用一樣,block內部可以修改形參,并且影響到實參。

本文鏈接:http://www.cnblogs.com/NarutoYq/p/3880851.html

責任編輯:chenqingxiang 來源: cnblogs
相關推薦

2014-07-30 11:12:09

block

2010-07-20 14:41:55

Perl語法

2010-09-16 09:13:09

CSS display

2010-03-15 10:49:57

Python函數變量

2010-07-13 09:23:00

Perl變量

2010-07-16 12:59:46

Perl簡單變量

2017-03-07 09:45:43

iOSBlock開發

2011-07-11 16:13:01

Java靜態變量實例變量

2016-03-30 09:56:07

c語言變量聲明objectivec

2010-01-21 16:37:56

VB.NET變量聲明

2010-01-14 17:41:57

VB.NET變量范圍

2009-12-01 19:08:18

PHP外部變量

2010-02-02 16:15:38

C++變量聲明

2010-07-20 15:54:40

Perl簡單變量

2016-03-07 09:09:35

blockios開發實踐

2023-12-29 08:27:36

C語言靜態變量開發

2013-06-04 15:41:31

iOS開發移動開發block

2025-01-10 09:47:43

blockSDKiOS

2009-12-11 10:41:11

PHP變量解析順序

2010-01-15 15:03:23

VB.NET對象變量聲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人免费一区二区三区视频网站 | 亚洲一区二区高清 | 伊人精品一区二区三区 | 亚洲视频一区在线观看 | 在线不卡视频 | 粉嫩在线 | 国产乱码久久久久久一区二区 | 中文一级片| 99riav国产一区二区三区 | 国产免费拔擦拔擦8x高清 | 日韩一区在线播放 | 中文字幕精品一区 | 亚洲一区中文字幕 | 欧美在线亚洲 | 国产精品视频在线观看 | 一区二区三区在线观看视频 | 成人精品高清 | 青青草视频免费观看 | 91精品免费视频 | 国产精品精品视频一区二区三区 | 久久精品色欧美aⅴ一区二区 | 日本成人福利 | 国产精品久久久久久久模特 | 这里只有精品999 | 亚洲国产精品一区二区三区 | 午夜免费观看网站 | 999免费视频| 精品国产欧美一区二区三区成人 | 在线观看中文字幕 | 久久久久久久久淑女av国产精品 | 久久综合狠狠综合久久综合88 | 久久久五月天 | 欧美精品久久 | 精品一区二区电影 | 影音先锋久久 | 一二三四在线视频观看社区 | 国产激情视频在线 | 亚洲v日韩v综合v精品v | 亚洲免费在线播放 | 久久99视频这里只有精品 | 99福利网|