学习啦>知识大全>知识百科>百科知识>

ios中什么是block

时间: 欧东艳656 分享

学习啦在线学习网   IOS(Internetworking Operating System-Cisco,缩写IOS),CISCO网络配置系统。IOS是一个为网际互连优化的复杂的操作系统——类似一个局域操作系统(NOS)、如Novell的NetWare,为LANs而进行优化。IOS为长时间经济有效地维护一个互联网络提供一下统一的规则。简而言之,它是一个与硬件分离的软件体系结构,随网络技术的不断发展,可动态地升 级以适应不断变化的技术(硬件和软件)。IOS可以被视作一个网际互连中枢:一个高度智能的管理员,负责管理的控制复杂的分布式网络资源的功能。

  Block可以帮助我们组织独立的代码段,并提高复用性和可读性。iOS4在UIKit中引入了该特征。超过100个的Apple API都使用了Block,所以这是一个我们必须开始熟悉的知识。

  Block是什么样的?

学习啦在线学习网   你可以使用^操作符来声明一个Block变量,它表示一个Block的开始。

  int num1 = 7;

学习啦在线学习网   int(^aBlock)(int) = ^)int num2) {

学习啦在线学习网   return num1+nunm2;

  };

  在如上代码中我们将Block声明为一个变量,所以可以将它当做一个函数中使用:

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

  我们刚看过了将block当做变量的情况,但通常情况下我们会以内联的方式使用Block,比如在一个变量中。API要么会使用Block在一个对象集合上执行某种操作,要么将其作为一个操作完成后的回调。

  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具有将临时函数体创建为表达式的优势。Apple文档中指出:

学习啦在线学习网   Block是符合如下要求的匿名内联的代码集:

学习啦在线学习网   和函数一样具有一个指定类型的参数列表

学习啦在线学习网   有一个可以推导或声明的返回值类型

学习啦在线学习网   可以从它被定义的词义范围中捕捉状态

学习啦在线学习网   可以在需要的时候改变词义范围的状态

  可以和相同的词义范围中定义的其他的Block共享更改的可能。

学习啦在线学习网   可以在词义范围(堆栈帧)被销毁后继续共享和修改该词义范围(堆栈帧)的状态。

学习啦在线学习网   Block是一个自包含的小代码段,封装了用于遍历(线性遍历)或者回调,可以并发执行的任务单元。

学习啦在线学习网   声明和使用Block

  Apple文档中介绍了如何将一个Block声明为变量,并将其作为一个函数使用:

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

学习啦在线学习网   return anInt - 1;

  };

  // 我们创建了一个内联块^(int anInt)... ,其函数体和结果被传到了另外一个名为OneFrom的Block。

学习啦在线学习网   printf("1 from 10 is %d", oneFrom(10));

学习啦在线学习网   // 打印出: "1 from 10 is 9"

学习啦在线学习网   // 这个block函数(distanceTraveled)传入3个float型参数,返回float值。

学习啦在线学习网   float (^distanceTraveled) (float, float, float) =

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

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

学习啦在线学习网   return distance;

  };

  你也可以传入一个Block作为一个参数,而不要以如上的方式声明它们,这样就可以在需要将block作为参数的时候以内联代码的方式简单地实现。

学习啦在线学习网   NSArray *anArray = [NSArray arrayWithObjects: @"cat", @"dog",nil];

学习啦在线学习网   sortFunction(anArray, ^(string *a string *b){

学习啦在线学习网   if ( a == @"cat") return TRUE; });

  这样我们就看到一个内联的block代码段占据了最后一个参数(必须是参数列表的最后一个参数)的位置。Cocoa提供了很多使用Block的方法,这样你就可以传入Block作为方法的参数:

  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