Objective-C Block基本用法

Objective-C Block基本用法

1. 代码块的声明和赋值

 首先说一下普通变量的声明语法:  

int num;    // 声明一个变量,变量名为num,      语法为:  数据类型 变量名;
num = 10;   // 给变量赋值                     语法为:  变量名 = 值;

再说代码块声明和赋值前先给出一个示例:     

// 声明一个代码块变量,变量名为:myBlock  语法为:返回值(^变量名)(参数列表)
int (^myBlock)(int);          
// 给代码块变量myBlock赋值             语法为:  变量名 = ^(参数列表){ // 代码块体}
myBlock = ^(int num){         
	   return num * 10;
};



代码块变量的声明和普通变量的声明语法不一样,代码块的声明语法就像一个函数的定义一样 语法为:

 返回值(^变量名)(参数列表);   语法稍微有点怪,代码块给变量赋值和普通变量赋值不一样:     
代码块变量 = ^[返回值类型][(参数列表)]{

                      };

代码块声明和赋值语法说明:

① 对于代码块的声明

如果代码块没有返回值则用void关键字代替,对于参数列表如果没有参数,则也用关键字void代替,对于有参数列表,可以对参数列表只指明各个参数的数据类型,可以不指定参数名,当然带上参数名可提高代码的可读性。

void (^myBlock1)(void);			// 无返回值,无参数
void (^myBlock2)(NSString, int);	// 有返回值,有参数
NSString (^myBlock3)(void);		// 有返回值,无参数
//有返回值和参数,并且在参数类型后面加入了参数名(提高代码的可读性)
NSString* (^myBlock4)(NSString* name, int age); 


② 对于代码块的变量的声明的数据类型

声明一个变量:  int (^myBlock)(int); 这样就声明了一个代码块变量, 变量名是:myBlock,  变量名对应的数据类型是: int(^)(int)   整个一块都是代码块所对应的数据类型;除了变量名之外的部分都称为数据类型,代码块变量的声明和普通变量的声明不一样,按照普通变量的那种语法应该是:  int(^)(int)   myBlock; 但这样Xcode语法报错,要想和传统的变量声明的语法一样,可以这样做: 先将Block的数据类型int(^)(int, int)起一个别名,例如Block , 然后再使用别名 Block block; 这样就和 int a; 这样的语法一致了,这也是最佳实践

typedef int(^Block)(int, int);
Block block;

代码块变量赋值可以在声明的时候赋值,也可以先声明,然后再赋值,分开写;

③:对于代码块的赋值

中括号[] 的意思是说 中括号中的语法可以没有,代码块可以没有返回值,可以没有参数,也可以返回值和参数都没有,

        对于没有参数列表的,直接省略参数列表的声明,对于代码块的返回值可以一直省略:原因是系统本身有一个叫“类型推断”的功能,可根据代码块的数据类型推断出返回值的数据类型,对于系统能推断出返回值类型,为了减少代码的书写和带们的简洁一般都会省掉返回值部分,注意要在花括号结尾处 跟上 分号  {};

// 无返回值,无参数
myBlock1 = ^ {
	NSLog(@"%@", @"myBlock1");
};

// 有返回值(可省略),有参数
myBlock2 = ^ (NSString name, int age){
	NSLog(@"%@ :", name);
};

// 有返回值(省略返回值语法),无参数(省略参数列表语法)
myBlock3 = ^ {
	return 3.14;
};

//有返回值(省略返回值语法)和参数
myBlock4 = ^ (NSString name, int age){
	NSLog(@"%@ :", name);
	return name;
};	


2. 代码块常用场景

代码块和其他语言中的匿名函数, 闭包差不多, 一个block就是一个匿名的内联代码集合体: 代码块一般作为回调函数使用

可以让你在调用的地方编写代码实现后面将要执行的操作。

把代码块的变量名可以看做方法名来调用block


3. 示例代码

        // 变量声明和赋值分开--------------------------------
        void(^afterSetValue)(void);
        afterSetValue = ^{
            NSLog(@"变量声明和赋值分开");
        };
        afterSetValue();
        
        // 有参数,有返回值---------------------------------
        int a = 10;
        int (^myBlock)(int) = ^(int num){
            return num * a;
        };
        
        int result = myBlock(2);
        NSLog(@"result: %d", result);                   // 20
        
        
        // 有参数,有返回值--------------------------------
        void (^noReturnBlock2)(int) = ^(int a){
            NSLog(@"a:%d", a);
        };
        noReturnBlock2(2);
        
        
        // 无参数,有返回值--------------------------------
        int (^noReturnBlock)(void) = ^int{
            return 10;
        };
        
        NSLog(@"noReturnBlock: %d", noReturnBlock());  // 10
        
        // 无参数无返回值---------------------------------
        void (^noReturnAndNoPrameterBlock)(void) = ^ {
            NSLog(@"noReturnAndNoPrameterBlock------");
        };
        noReturnAndNoPrameterBlock();
        
        // 修改代码块之外的全局变量--------------------------------
        __block int b = 1;
        void (^modifyValue)(void) = ^{
            b = 2;
        };
        modifyValue();
        NSLog(@"b: %d", b);
2016-03-09 11:30:36.886 MianTest[10966:1571284] 变量声明和赋值分开
2016-03-09 11:30:36.887 MianTest[10966:1571284] result: 20
2016-03-09 11:30:36.888 MianTest[10966:1571284] a:2
2016-03-09 11:30:36.888 MianTest[10966:1571284] noReturnBlock: 10
2016-03-09 11:30:36.888 MianTest[10966:1571284] noReturnAndNoPrameterBlock------
2016-03-09 11:30:36.888 MianTest[10966:1571284] b: 2
Program ended with exit code: 0

#import <Foundation/Foundation.h>

@interface Calculator : NSObject

@property (nonatomic, assign) int result;

- (void)calculator:(void(^)(int num))calculator;

- (void(^)(void))test;
@end
#import "Calculator.h"

@implementation Calculator

- (void)calculator:(void(^)(int) )calculator {
    
    calculator(10);
    
}

- (void (^)(void))test {

    return ^{
        NSLog(@"return block");
    };
}
@end
main.m
Calculator * calc = [[Calculator alloc] init];
        
 // 方法参数是代码块
 [calc calculator:^(int num) {
        num += 2;  
        NSLog(@"num is : %d", num);
 }];
        
        
// 方法返回值是代码块--------------------------------
[calc test]();
2016-03-09 13:29:47.636 MianTest[11022:1587620] num is : 12
2016-03-09 13:29:47.637 MianTest[11022:1587620] return block



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风流 少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值