iOS技術總結(Block)[整理]

摘要

. Block代碼塊結構及幾種類型
. __block使用
.使用block在兩個界面中傳值問題

官方文檔:蘋果的文檔

概括

代碼塊本質上是和其他變量類似。不同的是,代碼塊存儲的數據是一個函數體。使用代碼塊是,你可以像調用其他標準函數一樣,傳入參數數,并得到返回值。
脫字符(^)是塊的語法標記。按照我們熟悉的參數語法規約所定義的返回值以及塊的主體(也就是可以執行的代碼)。下圖是如何把塊變量賦值給一個變量的語法講解:



按照調用函數的方式調用塊對象變量就可以了:int result = myBlock(4);
// result是 28

下面的代碼假設是寫在ViewController子類中的

1、第一部分

定義和使用Block,

- (void)viewDidLoad{ 
   [super viewDidLoad];   
 //(1)定義無參無返回值的Block   
   void (^printBlock)() = ^(){     
    printf("no number");  
    };  
   printBlock();      
   printBlock(9);       

//(2)定義一個有參數,沒有返回值的Block
  void (^printNumBlock)(int) = ^(int num){   
     printf("int number is %d",num);
  };
 //(3)定義名為myBlock的代碼塊,返回值類型為int  
  int (^myBlock)(int) = ^(int num){    
    return num*mutiplier;   
  }    
//使用定義的myBlock  
  int newMutiplier = myBlock(3); 
  printf("newMutiplier is %d",myBlock(3));
}
2、第二部分

** __block關鍵字的使用**

在Block的{}體內,是不可以對外面的變量進行更改的,比如下面的語句,

//將Block定義在方法內部   
int x = 100;   
void (^sumXAndYBlock)(int) = ^(int y){ 
    x = x+y;   
  printf("new x value is %d",x);  
 };  
 sumXAndYBlock(50);
}

這段代碼有什么問題呢,Xcode會提示x變量錯誤信息:Variable is not assigning (missing __block type),這時候給int x = 100;
語句前面加上__block關鍵字即可,如下,
__block int x = 100;

這樣在Block的{}體內,就可以修改外部變量了。

3、第三部分:Block作為property屬性實現頁面之間傳值

需求: 在ViewController中,點擊Button,push到下一個頁面NextViewController,在NextViewController的輸入框TextField中輸入一串字符,返回的時候,在ViewController的Label上面顯示文字內容,

(1)第一種方法:首先看看通過“協議/代理”是怎么實現兩個頁面之間傳值的吧,

//NextViewController是push進入的第二個頁面

//NextViewController.h 文件
//定義一個協議,前一個頁面ViewController要服從該協議,并且實現協議中的方法
@protocol NextViewControllerDelegate <NSObject>
- (void)passTextValue:(NSString *)tfText;
@end
@interface NextViewController : UIViewController
@property (nonatomic, assign) id<NextViewControllerDelegate> delegate;
@end

//NextViewController.m 文件
//點擊Button返回前一個ViewController頁面
-(IBAction)popBtnClicked:(id)sender { 
  if (self.delegate && [self.delegate respondsToSelector:@selector(passTextValue:)]) {     
      //self.inputTF是該頁面中的TextField輸入框    
       [self.delegate passTextValue:self.inputTF.text];  
 }   
[self.navigationController popViewControllerAnimated:YES];
}

接下來我們在看看ViewController文件中的內容,

//ViewController.m 文件
@interface ViewController ()<NextViewControllerDelegate>
@property (strong, nonatomic) IBOutlet UILabel *nextVCInfoLabel;
@end
//點擊Button進入下一個NextViewController頁面
- (IBAction)btnClicked:(id)sender{ 
   NextViewController *nextVC = [[NextViewController alloc] initWithNibName:@"NextViewController" bundle:nil];  
     nextVC.delegate = self;//設置代理   
     [self.navigationController pushViewController:nextVC animated:YES];
   }
//實現協議NextViewControllerDelegate中的方法
#pragma mark - NextViewControllerDelegate method
- (void)passTextValue:(NSString *)tfText{   
 //self.nextVCInfoLabel是顯示NextViewController傳遞過來的字符串Label對象  
   self.nextVCInfoLabel.text = tfText;
}

這是通過“協議/代理”來實現的兩個頁面之間傳值的方式。
(2)第二種方法:使用Block作為property,實現兩個頁面之間傳值,
先看看NextViewController文件中的內容,

//NextViewController.h 文件
@interface NextViewController : UIViewController
@property (nonatomic, copy) void (^NextViewControllerBlock)(NSString *tfText);
@end

//NextViewContorller.m 文件
- (IBAction)popBtnClicked:(id)sender {  
  if (self.NextViewControllerBlock) {     
   self.NextViewControllerBlock(self.inputTF.text);  
  }  
  [self.navigationController popViewControllerAnimated:YES];
}

再來看看ViewController文件中的內容,

- (IBAction)btnClicked:(id)sender{  
  NextViewController *nextVC = [[NextViewController alloc] initWithNibName:@"NextViewController" bundle:nil];   
  nextVC.NextViewControllerBlock = ^(NSString *tfText){  
      [self resetLabel:tfText];   
    }; 
   [self.navigationController pushViewController:nextVC animated:YES];
}
#pragma mark - NextViewControllerBlock method
- (void)resetLabel:(NSString *)textStr{   
   self.nextVCInfoLabel.text = textStr;
}

簡單總結加深理解,難登大雅之堂,勿噴~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376

推薦閱讀更多精彩內容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,197評論 30 471
  • Block基礎回顧 1.什么是Block? 帶有局部變量的匿名函數(名字不重要,知道怎么用就行),差不多就與C語言...
    Bugfix閱讀 6,790評論 5 61
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,731評論 18 399
  • 《Objective-C高級編程》這本書就講了三個東西:自動引用計數、block、GCD,偏向于從原理上對這些內容...
    WeiHing閱讀 9,863評論 10 69
  • 持續的做一件事的幾個準備 做好準備工作 儀式感 時間表 日程清單以上是我對持續的做一件事的一點心得,下面一個一個說...
    才少說閱讀 265評論 0 0