IOS中block的使用方法

X.1 初探Block

在这一小节我们先用一些简单范例来导入block的概念。

X.1.1 宣告和使用Block

我们使用「^」运算子来宣告一个block变数,而且在block的定义最后面要加上「;」来表示一个完整的述句(也就是将整个block定义视为前面章节所介绍的简单述句,因为整个定义必须是一个完整的句子,所以必须在最后面加上分号),下面是一个block的范例:

   1: int multiplier = 7 ;
   2: int (^myBlock)( int ) = ^( int num)
   3: {
   4:     return num * multiplier;
   5: };

我们使用下图来解释这个范例(请将文字框的字翻译如下):

我们宣告一个「myBlock」变数,用「^」符号来表示这是一个block。

这是block的完整定义,这个定义将会指定给「myBlock」变数。

表示「myBlock」是一个回传值为整数(int)的block。

它有一个参数,型态也是整数。

这个参数的名字叫做「num」。

这是block的内容。

值得注意的地方是block可以使用和本身定义范围相同的变数,可以想像在上面的例子中 multiplier 和 myBlock 都是某一个函数内定义的两个变数也就是这个变数都在某个函数两个大括号「{」和「 }」中间的区块,因为它们的有效范围是相同的,因此在block中就可以直接使用 multiplier 这个变数,此外当把block定义成一个变数的时,我们可以直接像使用一般函数般的方式使用它:

   1: int multiplier = 7 ;
   2: int (^myBlock)( int ) = ^( int num)
   3: {
   4:     return num * multiplier;
   5: };
   6: printf ( "%d" , myBlock( 3 ));
   7: //结果会打印出21

X.1.2 直接使用Block

在很多情况下,我们并不需要将block宣告成变数,反之我们可以直接在需要使用block的地方直接用内嵌的方式将block的内容写出来,在下面的例子中qsort_b函数,这是一个类似传统的qsort_t函数,但是直接使用block做为它的参数:

   1: char *myCharacters[ 3 ] = { "TomJohn" , "George" , "Charles Condomine" };
   2: qsort_b (myCharacters, 3 ,
   3:          sizeof ( char *),
   4:          ^( const void *l, const void *r)//block部分
   5:             {
   6:                 char *left = *( char **)l;
   7:                 char *right = *( char **)r;
   8:                 return strncmp (left, right, 1 );
   9:             }                            //end
  10: );

X.1.3 __block 变量

一般来说,在block内只能读取在同一个作用域的变数而且没有办法修改在block外定义的任何变数,此时若我们想要这些变数能够在block中被修改,就必须在前面挂上__block的修饰词,以上面第一个例子中的 multiplier 来说,这个变数在 block 中是唯读的,所以 multiplier = 7 指定完后,在 block 中的 multiplier 就只能是 7 不能修改,若我们在 block 中修改 multiplier ,在编辑时就会产生错误,因此若想要在 block 中修改 multiplier ,就必须在 multiplier 前面加上 __block 的修饰词,请参考下面的范例:

   1: __block int multiplier = 7 ;
   2: int (^myBlock)( int ) = ^( int num)
   3: {
   4:   if (num > 5 )
   5:   {
   6:       multiplier = 7 ;
   7:     }
   8:     else
   9:     {
  10:         multiplier = 10 ;
  11:     }
  12:     return num * multiplier;
  13: };

使用block的示例代码

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 200)];
    view.backgroundColor = [UIColor yellowColor];
    [self.view addSubview:view];

    void (^blockAnimation)() = ^(){
        view.frame = CGRectMake(100, 100, 100, 200);
    };
    void (^blockFinished)(BOOL finished) = ^(BOOL finished){
        view.frame = CGRectMake(0, 0, 100, 200);
    };
    [UIView animateWithDuration:1.0 animations:blockAnimation completion:blockFinished];

}

IOS中block的使用方法

时间: 2024-07-30 13:51:48

IOS中block的使用方法的相关文章

iOS中数组遍历的方法及比较

数组遍历是编码中很常见的一种需求,我们来扒一拔iOS里面都有什么样的方法来实现,有什么特点. 因为iOS是兼容C语言的,所以C语言里面的最最常见的for循环遍历是没有问题的. 本文中用的数组是获取的系统的语言数组,大约有30多个数据,虽然还不够模拟大批量的数据,但对于方法的验证是没有问题的了. NSArray *langArray = [[NSUserDefaults standardUserDefaults] arrayForKey:@"AppleLanguages"]; 第一种方法

iOS中block类型大全

iOS中block类型大全 typedef的block 作为属性的block 作为变量的block 作为方法变量入参的block 作为方法参数的block 无名block 内联函数的block 递归调用的block 作为方法返回值的block 作为函数名的block(太过奇葩,完全不知道怎么用-_-!) iOS中block类型大全,码迷,mamicode.com

IOS中Block的循环引用

@interface DemoObj() @property (nonatomic, strong) NSOperationQueue *queue; @end @implementation DemoObj - (instancetype)init { self = [super init]; if (self) { self.queue = [[NSOperationQueue alloc] init]; } return self; } - (void)dealloc { NSLog(@"

iOS 中Block以及Blocks的使用

一.ios中block的使用 Block可以帮助我们组织独立的代码段,并提高复用性和可读性.iOS4在UIKit中引入了该特征.超过100个的Apple API都使用了Block,所以这是一个我们必须开始熟悉的知识. Block是什么样的? 你可以使用^操作符来声明一个Block变量,它表示一个Block的开始. int num1 = 7; int(^aBlock)(int) = ^(int num2) { return num1+nunm2; }; 在如上代码中我们将Block声明为一个变量,

iOS中block用法之两个界面传值问题

Block的使用有很多方面,其中传值只是它的一小部分,但是很常用更实用,下面介绍Block在两个界面之间的传值用法: 先说一下思想: 首先,创建两个视图控制器,在第一个视图控制器中创建一个Label和一个Button,其中Label是为了显示第二个视图控制器传过来的字符串, Button是为了push到第二个界面. 第二个界面的只创建一个TextField,是为了输入文字,当输入文字并且返回第一个界面的时候(第二个视图将要消失的时候),就将这个 TextFiled中的文字传给第一个界面并且显示在

IOS中 Block简介与用法(一)

?Block简介: Block的实际行为和Function很像,最大的差别是在可以存取同一个Scope的变量值.Block实体形式如下: ^(传入参数列){行为主体}; Block实体开头是"^",接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal.行为主体可以用return回传值,类型会被compiler自动辨别.如果没有参数列要写成: ^(void). 例如下面的一个例子: [cpp] vi

iOS中block的用法 以及和函数用法的区别

ios中block的用法和函数的用法大致相同 但是block的用法的灵活性更高: 不带参数的block: void ^(MyBlock)() = ^{}; 调用的时候  MyBlock(); 带参数的block: int ^(MyBlock)(int,int) = ^(int a,int b){return a+b;} 调用MyBlock(5,6); 将block当作某个类的属性的写法 typedef void (^BlockOption)(); @property (nonatomic,ass

ios中图像进行压缩方法汇总

ios中图像进行压缩方法汇总 在Iphone上有两种读取图片数据的简单方法: UIImageJPEGRepresentation和UIImagePNGRepresentation. UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数.而UIImagePNGRepresentation只需 要图片引用作为参数. 方法一: 代码如下: - (UIImage*)scaleFromImage:(UIImage*)image scaledToSize:(CGSize)

iOS中解析json多种方法

我感觉JSON解析,重要的是JSON解析之后对结果的处理JSON解析后是个dictionary,但是字典中有可能包含字典和数组,数组中还可以包含字典.向客户端请求的返回数据解析下面就简单介绍一下JSON解析过程其实就一句话 "data就是解析数据"!!!!!!!!!!!!!! //xcode自带解析类NSJSONSerialization从data中解析出数据放到字典中NSDictionary *weatherDic = [NSJSONSerialization JSONObjectW