OC 代码块

//代码块:普通代码块  构造代码块  静态代码块

//一.定义一个普通代码块

//定义方式1  返回类型 (^代码块名称) (参数类型) = ^(参数类型 参数名){};

//1.无返回类型的代码块 参数类型可为空也可为其他类型

void (^my_block1) (void) = ^(void)

{

NSLog(@"hello world");

};

my_block1();

void (^my_block) (int) = ^(int number)

{

number = 1;//带参数进入代码块运算 结果为5 当进入作用域里面的时候给number再次赋值 此时5将被覆盖 结果number为1

NSLog(@"%i",number);

};

my_block(5);

//2.有返回类型的代码块

int (^my_blockI) (int number) = ^(int number)

{

return number * number;

};

int num = my_blockI(10);

NSLog(@"%i",num);

//定义方式2  返回类型 (^代码块名称) (参数类型);

//           代码块名称 = ^(参数类型 参数名){};

void (^my_block2) (int);

my_block2 = ^(int number)

{

NSLog(@"%i",number);

};

my_block2(9);

//带两个参数的代码块

int (^sumBlock) (int,int) = ^(int number1,int number2)

{

return number1 + number2;

};

int result = sumBlock(5,9);

NSLog(@"result:%i",result);

//在代码块外边定义的变量可以在代码块里面使用

int addSum = 0;

for (int i=1; i<=10; i++) {

addSum = sumBlock(addSum,i);

}

NSLog(@"sum:%i",addSum);

//二.构造代码块

//用构造块的关键字定义代码块 typedef  注意:参数类型和参数的个数要保持一致

typedef void (^my_block3)(int);//构建了一个代码块类型

my_block3 num1 = ^(int number)

{

NSLog(@"num:%i",number);

};

num1(8);

//数组的一个方法 代码块可以作为一个参数 该方法可对一个数组进行排序 sortedArrayUsingComparator

NSArray *array = @[@"hello",@"person",@"father",@"hunter"];

NSArray *arr = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {

return [obj1 compare:obj2];

}];

NSLog(@"%@",arr);

//--------局部变量

int  a=10, b=20;

typedef int (^multiplyBlock)(void);

multiplyBlock multiply = ^(void)

{

return a * b;

};

NSLog(@"result1=%i",multiply());//输出结果为200

a=20,b=30;

NSLog(@"result2=%i",multiply());//输出结果还是200 a b的值没有发生改变

//---------全局变量

static int c=10, d=20;

typedef int (^multiplyBlock2)(void);

multiplyBlock2 multiplyI = ^(void)

{

return c*d;

};

NSLog(@"result3=%i",multiplyI());//输出结果为200

c=20,d=30;

NSLog(@"result4=%i",multiplyI());//输出结果为600 a b的值发生改变

//    static void (^addblock)(int,int) = ^(int i,int sum)

//    {

//        for (i=0; i<11; i++) {

//            sum += i;

//        }

//

//        NSLog(@"result=%i",sum);

//    };

//    addblock(0,0);

//三.静态代码块

//代码块的递归调用 (递归调用的意思是自己可以调用自己) 递归调用的前提是代码块变量必须是全局变量或静态变量

static void(^const block)(int) = ^(int i)

{

if (i>0) {

NSLog(@"num:%i",i);

block(i-1);

}

};

block(3);

//递归方式计算1到10的和

static int(^sum_block)(int) = ^(int number1)

{

if (number1<11) {

//            NSLog(@"sum:%i",number1);

number1 += sum_block(number1+1);

NSLog(@"sum:%i",number1);

}

return number1;

};

sum_block(1);

static int i =10;

typedef int (^block3)(void);

block3  tem = ^(void)

{

i += 1;

return i;

};

NSLog(@"%i,%i",i,tem());

//在代码块中可以使用代码块改变全局变量

void(^block4)(void) = ^(void)

{

global++;//在主函数外定义

NSLog(@"%d",global);

};

//此时在代码块外的全局变量的值也发生了改变

block4();

NSLog(@"%i",global);

//用__block在代码块内部可以修改代码块外部的值

__block int a1= 10;

int (^block5)(int,int) = ^(int data1,int data2)

{

a1 = data1 * data2;

return a1;

};

NSLog(@"dataResult:%i",block5(3,5));//此时a1的结果为15 a1的值被修改

时间: 2024-08-02 17:29:53

OC 代码块的相关文章

oc 代码块的使用

#import <UIKit/UIKit.h> #import "AppDelegate.h" int (^max)(int,int);//定义代码块,类似c的函数指针 typedef void (^SayHello)(); //指定一个类型的代码块: int main(int argc, char * argv[]) { //通过函数闭包的方式实现代码块 max=^(int a,int b){ return a>b?a:b; }; //调用代码块 printf(&q

[转]iOS代码块Block

代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返回值,特殊地,Block还可以保存一段代码,在需要的时候调用,目前Block已经广泛应用于iOS开发中,常用于GCD.动画.排序及各类回调 注: Block的声明与赋值只是保存了一段代码段,必须调用才能执行内部代码 Block变量的声明.赋值与调用 Block变量的声明 Block变量的声明格式为: 返回值类型(^Block名字)(参数列表); /

代码块和并发性

代码块对象: 通常称:代码块,是对C语言的扩展,,除了函数中的代码,其害包含变量绑定.代码块有时也被称为闭包(closure).两种绑定类型:自动型和托管型.自动型使用的是栈中的内存,而托管绑定是通过堆创建的. 代码块和函数指针: 代码块特征:1.返回类型可以手动声明也可以由编译器推导.2.具有指定类型的参数列表.3.有用名称. 声明一个函数指针:void(*my_func)(void); 这是很基础的函数指针,它没有参数和返回结果,只要把 * 替换成 ^ 就可以把它转换成一个代码块的定义了.如

java学习中,匿名函数、构造方法、构造代码块、构造方法中调用构造方法(java 学习中的小记录)

java学习中,匿名函数.构造方法.构造代码块.构造方法中调用构造方法(java 学习中的小记录) 作者:王可利(Star·星星) 匿名函数 匿名对象:没有名字的对象 匿名对象使用的注意点: 1.一般不会用匿名对象给属性赋值,无法获取属性值,每次new 都是一个新的对象. 2.匿名对象永远都不可能是一个对象. 如:person new().name = "星星":是不行的 匿名对象的好处:书写简单. 匿名对象使用的场景: 1.如果一个对象调用一个方法一次的时候,就可以用匿名对象来调用.

一篇文章看懂iOS代码块Block

iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返回值,特殊地,Block还可以保存一段代码,在需要的时候调用,目前Block已经广泛应用于iOS开发中,常用于GCD.动画.排序及各类回调 注: Block的声明与赋值只是保存了一段代码段,必须调用才能执行内部代码 Block变量的声明.赋值与调用 Block变量的声明 Block变量的声明格式为: 返回值类型(^Bl

修饰符-包-内部类-代码块执行顺序

1.访问权限修饰符     从大到小的顺序为:public--protected--default--private     private--只能在同一类中使用;     default--不用写出来,默认不加.可以被同一包中的类使用     protected--可以被不同包的子类使用     public--可以被不同包的其它类使用 2.各种修饰符的修饰对象(可修饰哪些:类/接口/方法/属性)(多个修饰符连用是可以没有顺序的!)     1)访问权限修饰符:public/default--

iOS学习之代码块(Block)

代码块(Block) (1)主要作用:将一段代码保存起来,在需要的地方调用即可. (2)全局变量在代码块中的使用: 全局变量可以在代码块中使用,同时也可以被改变,代码片段如下: 1 int local = 1;//注意:全局变量 2 void (^block0)(void) = ^(void){ 3 local ++; 4 NSLog(@"local = %d",local); 5 }; 6 block0(); 7 NSLog(@"外部 local = %d",lo

[Java基础]代码块

1. 2.构造代码块 public class CBlock { public CBlock()//构造函数 { i=300;//构造函数中初始化 } public int i=100;//显示初始化变量 {//构造代码块 i=200;//构造代码块中初始化变量 } } 从以下几点理解以上代码: java编译器编译一个java源文件的时候,会把成员变量的声明语句提前至一个类的最前端. 成员变量的初始化工作其实都在在构造函数中执行的. 一旦经过java编译器编译后,那么构造代码块的代码块就会被移动

Java(静态)变量和(静态)代码块的执行顺序

本文讨论Java中(静态)变量.(静态)代码块的执行顺序 首先创建3个类: 1.Foo类,用于打印变量 public class Foo { public Foo(String word) { System.out.println(word); } } 2.Parent类 public class Parent { static Foo FOO = new Foo("Parent's static parameter"); Foo foo = new Foo("Parent'