//
// main.m
// IOS150626_ObjectiveC_Block块
//
// Created by PengJunlong on 15/6/26.
// Copyright (c) 2015年 Peng Junlong. All rights reserved.
//
#import <Foundation/Foundation.h>
//函数指针
int add(int a, int b) //add的类型是 int (*)(int,int)
{
return a+b;
}
typedef int (* padd)(int,int); //padd类型是 int (*)(int,int) 函数指针
//Block是OC中的数据类型,用来保存一段代码块
typedef int(^ addBlock)(int, int); //与函数指针的区别是^和*,Block是放在函数中使用
typedef int(^ MyBlock)(int, int);
//函数中不能再定义函数,而函数中可以定义block块
//block其实是一种数据类型,这个数据类型声明的变量里存放的值是一段代码块
int main(int argc, const char * argv[]) {
@autoreleasepool {
padd funadd = add;
NSLog(@"sum = %d",funadd(4,6));
//不带参数的Block
void (^printBlock)(void) = NULL;
printBlock = ^(void)
{
NSLog(@" *");
NSLog(@" ***");
NSLog(@"*****");
}; //一定要有分号,在方法内部,是代码块,而不是方法
printBlock();
//省略(void)
void (^printThreeRect)(void) = ^
{
NSLog(@" *");
NSLog(@" ****");
NSLog(@" ******");
NSLog(@"********");
};
printThreeRect();
//带参数的block
int (^minusBlock)(int, int) = ^(int a, int b)
{
return a-b;
};
NSLog(@"minus = %d",minusBlock(8,3));
//block可以直接读取block外部变量,但是不能修改;如果要修改block外部变量的值,则需要在外部变量的前面加__block修饰该变量
__block int num = 99;
void (^numBlock)(void) = ^
{
NSLog(@"%d",num);
};
numBlock();
void (^setBlock)(int) = ^(int value)
{
num = value; //修改block外部变量的值,则需要在外部变量的前面加__block修饰该变量
NSLog(@"num = %d",num);
};
setBlock(100);
MyBlock multiBlock = ^(int a, int b)
{
return a*b;
};
NSLog(@"multy = %d",multiBlock(3,7));
}
return 0;
}