iOS 初学笔记之Block语法基础

block语法的实现与c语言中的函数指针原理相同,下面我们先来看看什么是函数指针。
1. c 语言函数指针
a. 无返回值的函数
void (*p)(void) // p函数指针的变量名称,后面的参数列表只写参数的数据类型而不用写参数名称
p的数据类型为 void(*)(void)
p = test;
p();

        void test(void)
        {
            nslog(@"我是一个C语言普通函数");
        }
  b. 有返回值的函数
            int sum(int,int);    //函数的声明部分 参数名称可以缺省 但是参数的数据类型不能缺省
            int sum(int a,int b)
            {
                return a+b;  //函数的实现部分 参数名不能缺省
            }
            int (*q)(int,int);
            q = sum;
            nslog(@"%@",q(3,4));
   c. typedef为数据类型起别名
                typedef int myInt;   myInt s = 1;
                typedef nsstring * (*y) (int,nsstring *);
                    //y就是nsstring * (*)(int,nsstring *)的别名
                y pointFun = appending;
            //y指向返回值类型为nsstring * ,参数类型为(int,nsstring *)这样的函数

2. block语法
它的定义格式与函数指针完全相同。函数指针使用 * 标识,而block变量使用的是 ^ 标识
a. 定义返回值类型为空 参数类型也为空的block变量
定义格式: 返回值类型(^变量名)(参数列表)
void (^myBlock)(void);
//变量名为myBlock 数据类型为void(^)(void)
为block变量赋值
赋值格式: ^返回值类型(参数列表) 参数列表必须带有参数名称
myBlock = ^void(void){
nslog(@”我是普通的Block变量”);
};
【注意】myBlock变量赋值以后 不会直接执行 {} 中的代码 必须加上下面代码
打印block语句块的内容
myBlock(); //block指向的函数的调用

    myBlock  = ^(void){
            nslog(@“block函数返回值为void类型 可以缺省”);
                        };
            myBlock();

    myBlock = ^{
        nslog(@“block函数的从参数为void类型那么参数部分可以缺省”);
                };
            myBlock();

b. 定义返回值类型为nsstring * , 参数为int ,nsstring *
nsstring * (^yourBlock)(int,nsstring *);
yourBlcok = ^ nsstring * (int a,nsstring * s){
return [nsstring stringwithformat:@”%d,%@”,a,s];
};
nsstring * stringAll = yourBlock(100,@”元”);
nslog(@”%@”,stringAll);

c. 求连个数的和
int (^sum) (int,int);
sum = ^ int (int a,int b){
return a + b;
};
nslog(@”%d”,sum(10,30));

d. 使用typedef为block类型起别名
typedef int(^hisBlock)(int,int);
//使用hisBlock替代 int (^)(int,int)类型
hisBlock block = ^int(int a,int b){
return a-b;
};
nslog(@”%d”,block(9,1));

e. block变量之间可以相互赋值
hisblock block1 = block;

f. block变量作为函数的形参
这里首先要新建一个类 Custom
在custom.h 中声明一个 实例方法 -(void)testInfo;
在custom.m中实现该方法
typedef nsstring * (^ourBlock)(nsstring ,nsstring );
-(void)testInfo
{
void (^myblock)(void);
myblock = ^{
nslog(@”六一快乐”);
};
[self runoneblock:myblock];

int (^ yourblock)(int ,int);
yourblock = ^int(int a,int b){return a+b };
    //yourblock的数据类型为 int(^)(int,int)
[self runtwoblock:yourblock];

-(void)runoneblock:(void(^)(void))block
{
block();
}
-(void)runtwoblock:(int(^)(int,int))block
{
    nslog(@"%d",block(10,20));
}

Block传值问题: 把后一界面的值传到前一个界面 利用的是赋值时 {}中的语句 不会立即调用

    假如后一界面视图 nextviewcontroller
        typedef void(^myblock)(uicolor *);
    //block变量作为类的成员变量 属性修饰符只能使用copy
    @property (noatomic,copy) myblock blocktemp;
        ......
当遇到点击事件时
-(void)pressBtn:(id)sender
{
    self.blocktemp([uicolor greencolor]);
    //block变量对应的语句块只用调用的block变量的时候才会被使用
    。。。
 }

在前面一个视图中 当点击按钮时,跳到后一界面 并为后一视图的成员变量tempblock赋值
-(void)pressBtn:(id)sender
{
nextviewcontroller * next = [[nextviewcontroller alloc]init];
next.blocktemp = ^(uicolor * color){
self.view.backgroundcolor = color;
…………………………………………
};

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值