//
// main.m
// block数据类型
//
// Created by admin on 15/8/12.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Calculate.h"
// 定义一个函数
void test()
{
NSLog(@"test函数");
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
/*
数据类型的作用: 是为了更加合理的分配内存空间
数据类型的功能特点:
1. 作为参数传递
2. 作为函数返回值】
3. 声明变量
OC中的数据类型:
1. 对象类型(NSObject * obj)
2. id
3. BOOL
4. block
5. SEL
6. 基本数据类型
*/
// 注意:block数据类型 和 指向函数的指针类似
// 指向函数的指针如下:
int (*myPoint)() = test;
myPoint(); // 这里就可以通过指针来调用test函数
// 注意:然而指向函数的指针不能直接指向函数即一个代码块,必须通过函数名来指向
// block就是弥补了这一点,能够直接保存一个函数体(代码块)
void (^myBlock)() = ^{
NSLog(@"jajajaj");
}; // 这里myBlock就代表后面括号中的代码块
myBlock();
// 也可以传入参数,有返回值
/*
int (^sumBlock)(int a, int b) = ^ int(int a, int b) {
return a + b;
};
int result = sumBlock(10, 20);
NSLog(@"%d", result);
*/
// block作为参数传递(block实际指向的是一个函数或者代码块,那么将这个函数或代码块作为参数传递)
// 使用场景:当在开发中,你发现一个方法中的算法,可以有多种实现,你一时还不能确定用哪种更好,你就可以吧方法中其中一个参数定义成block方式
/*
int (^jianBlock)(int a, int b) = ^int(int a, int b){
return a - b;
};
Calculate *cal = [[Calculate alloc]init];
int jian = [cal calculateWithNumber1:10 andNumber2:20 andCalculate:jianBlock];
NSLog(@"%d",jian);
*/
// 注意:如果在作用域范围之内,block是可以使用变量的,但是要在block代码块中改变非块中变量的值就要在变量前加__block
// int x =0;
__block int x = 0;
int (^sumBlock)(int a, int b) = ^ int(int a, int b) {
int result = (a + b) + x; // 这个是正确的
x = result; //这里就必须要求在定义x的时候前加__block
return result;
};
Calculate *cal = [[Calculate alloc]init];
int sum = [cal calculateWithNumber1:10 andNumber2:20 andCalculate:sumBlock];
NSLog(@"sum = %d",sum);
NSLog(@"x = %d",x);
}
return 0;
}
//
// Calculate.h
// OC的特有语法
//
// Created by admin on 15/8/12.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import <Foundation/Foundation.h>
// 创建一个别名为calculateBlock的block,返回值为int,有两个int类型的参数,这里与指向函数的指针类似
typedef int (^calculateBlock)(int a, int b);
@interface Calculate : NSObject
// 将block作为参数传入
// 这个函数的作用是计算两个数的加减乘除等运算,前两个参数是运算的数字,block类型的第三个参数的计算方法
- (int)calculateWithNumber1:(int)number1 andNumber2:(int)number2 andCalculate:(calculateBlock)calculate;
@end
//
// Calculate.m
// OC的特有语法
//
// Created by admin on 15/8/12.
// Copyright (c) 2015年 admin. All rights reserved.
//
#import "Calculate.h"
@implementation Calculate
- (int)calculateWithNumber1:(int)number1 andNumber2:(int)number2 andCalculate:(calculateBlock)calculate
{
return calculate(number1, number2);
}
@end