學(xué)習(xí)啦>知識大全>知識百科>百科知識>

ios中什么是block

時間: 歐東艷656 分享

  IOS(Internetworking Operating System-Cisco,縮寫IOS),CISCO網(wǎng)絡(luò)配置系統(tǒng)。IOS是一個為網(wǎng)際互連優(yōu)化的復(fù)雜的操作系統(tǒng)——類似一個局域操作系統(tǒng)(NOS)、如Novell的NetWare,為LANs而進(jìn)行優(yōu)化。IOS為長時間經(jīng)濟(jì)有效地維護(hù)一個互聯(lián)網(wǎng)絡(luò)提供一下統(tǒng)一的規(guī)則。簡而言之,它是一個與硬件分離的軟件體系結(jié)構(gòu),隨網(wǎng)絡(luò)技術(shù)的不斷發(fā)展,可動態(tài)地升 級以適應(yīng)不斷變化的技術(shù)(硬件和軟件)。IOS可以被視作一個網(wǎng)際互連中樞:一個高度智能的管理員,負(fù)責(zé)管理的控制復(fù)雜的分布式網(wǎng)絡(luò)資源的功能。

  Block可以幫助我們組織獨立的代碼段,并提高復(fù)用性和可讀性。iOS4在UIKit中引入了該特征。超過100個的Apple API都使用了Block,所以這是一個我們必須開始熟悉的知識。

  Block是什么樣的?

  你可以使用^操作符來聲明一個Block變量,它表示一個Block的開始。

  int num1 = 7;

  int(^aBlock)(int) = ^)int num2) {

  return num1+nunm2;

  };

  在如上代碼中我們將Block聲明為一個變量,所以可以將它當(dāng)做一個函數(shù)中使用:

  NSLog(@"%d", aBlock(49)); //adds 49 to 7 which gives us 56.

  我們剛看過了將block當(dāng)做變量的情況,但通常情況下我們會以內(nèi)聯(lián)的方式使用Block,比如在一個變量中。API要么會使用Block在一個對象集合上執(zhí)行某種操作,要么將其作為一個操作完成后的回調(diào)。

  NSComperator compareStringsBlock = ^(id stringA, id stringB) {

  NSRange rangeS = NSMakeRange (0, [stringA length]);

  return (stringA compare:stringB options:comparisonOptions range:rangeS locale:currentLocale];

  };

  NSArray *compareSortArray = [arrayOfStringDays sortArrayUsingComparator: compareStringsBlock]);

  Block具有將臨時函數(shù)體創(chuàng)建為表達(dá)式的優(yōu)勢。Apple文檔中指出:

  Block是符合如下要求的匿名內(nèi)聯(lián)的代碼集:

  和函數(shù)一樣具有一個指定類型的參數(shù)列表

  有一個可以推導(dǎo)或聲明的返回值類型

  可以從它被定義的詞義范圍中捕捉狀態(tài)

  可以在需要的時候改變詞義范圍的狀態(tài)

  可以和相同的詞義范圍中定義的其他的Block共享更改的可能。

  可以在詞義范圍(堆棧幀)被銷毀后繼續(xù)共享和修改該詞義范圍(堆棧幀)的狀態(tài)。

  Block是一個自包含的小代碼段,封裝了用于遍歷(線性遍歷)或者回調(diào),可以并發(fā)執(zhí)行的任務(wù)單元。

  聲明和使用Block

  Apple文檔中介紹了如何將一個Block聲明為變量,并將其作為一個函數(shù)使用:

  int (^oneFrom)(int) = ^(int anInt) {

  return anInt - 1;

  };

  // 我們創(chuàng)建了一個內(nèi)聯(lián)塊^(int anInt)... ,其函數(shù)體和結(jié)果被傳到了另外一個名為OneFrom的Block。

  printf("1 from 10 is %d", oneFrom(10));

  // 打印出: "1 from 10 is 9"

  // 這個block函數(shù)(distanceTraveled)傳入3個float型參數(shù),返回float值。

  float (^distanceTraveled) (float, float, float) =

  ^(float startingSpeed, float acceleration, float time) {

  float distance = (startingSpeed * time) + (0.5 * acceleration * time * time);

  return distance;

  };

  你也可以傳入一個Block作為一個參數(shù),而不要以如上的方式聲明它們,這樣就可以在需要將block作為參數(shù)的時候以內(nèi)聯(lián)代碼的方式簡單地實現(xiàn)。

  NSArray *anArray = [NSArray arrayWithObjects: @"cat", @"dog",nil];

  sortFunction(anArray, ^(string *a string *b){

  if ( a == @"cat") return TRUE; });

  這樣我們就看到一個內(nèi)聯(lián)的block代碼段占據(jù)了最后一個參數(shù)(必須是參數(shù)列表的最后一個參數(shù))的位置。Cocoa提供了很多使用Block的方法,這樣你就可以傳入Block作為方法的參數(shù):

  NSArray *array = [NSArray arrayWithObjects: @"A", @"B", @"C", nil];

  NSSet *filterSet = [NSSet setWithObjects: @"A", @"Z", @"Q", nil];

  BOOL (^test)(id obj, NSUInteger idx, BOOL *stop); //Block declaration returns BOOL, params inc. id and BOOL

  //body of block gets the block literal ^(id obj, NSUInteger idx, Bool *stop)... and the body logic

  test = ^ (id obj, NSUInteger idx, BOOL *stop) {

  if (idx < 5) {

  if ([filterSet containsObject: obj]) {

  return YES;

  }

  }

  return NO;

  };

  Apple提供的另外一個例子是:

  __block BOOL found = NO;

  NSSet *aSet = [NSSet setWithObjects: @"Alpha", @"Beta", @"Gamma", @"X", nil];

  NSString *string = @"gamma";

  //we provide below a way of how to enumerate, using our own compare logic

  [aSet enumerateObjectsUsingBlock:^(id obj, BOOL *stop) {

  if ([obj localizedCaseInsensitiveCompare:string] == NSOrderedSame) {

  *stop = YES;

  found = YES;

  }

  }];

  As you can see, it takes a little while to have it sink in but once you get it, it's quite simple. I suggest looking at Apple's documentation, as well as looking at the referenced APIs to see how they are used. Practice makes perfect.

245511