#import "ViewController.h"

 @interface ViewController ()

 @end

 @implementation ViewController

 - (void)viewDidLoad {

     [super viewDidLoad];

     [self showResultByNumber1:
andNumber2:
andBlock:^(int num1,int num2){
return num1 +num2;
}]; // [self textBlockTeDian];
// [self textBlockTeDian1];
// [self textBlockTeDian2];
[self textBlockTeDian3];
} #pragma mark - block基本语法
- (void)block1
{
/*
block(闭合代码块)- (返回值类型)(^block名)(参数列表) block类型:(返回值类型)(^)(参数列表)
block的名:block名 block不遵守引用计数
block的执行效率非常高
block一般被用界面传值,或者当做方法参数实现方法回调
*/
} #pragma mark - block基本用法
- (void)block2
{ //赋值语句
//block的实体在赋值的过程中不会被执行,
//当且仅当block被调用的时候,block的实体才会被执行 //block并不是方法,所以执行的时候并不需要self调用。直接执行即可 void (^block)(void) = ^{ NSLog(@"Hello Word");
};
block(); //int (^blockSum)(int, int) 表示,
//定义一个[有两个整形参数,返回值为整形]的blockSum的代码块
int (^blockSum)(int, int) = ^(int num1,int num2){
return num1 + num2; };
NSLog(@"%d",blockSum(,)); } #pragma mark - block用作方法参数
- (void)showResultByNumber1:(int)number1
andNumber2:(int)number2
andBlock:(int(^)(int,int))block
{
NSLog(@"Result:%d",block(number1,number2));
} #pragma mark - block特点
//值锁定(值拷贝)是针对于存储在堆栈区的数据 //值锁定-针对常变量
- (void)textBlockTeDian
{
int number = ;
/*
如果block内部引用了block外部的任意变量
那么这个block在ARC环境下
自动从static(栈)区copy到malloc(堆)区 block实体存在代码区,实体在编译的过程中已经执行了,编译时已经值锁定
*/
int (^block)(int) = ^(int num){
return num +number;
}; number = ;
NSLog(@"number:%d",block());
}
//值锁定-指针类型
- (void)textBlockTeDian1
{
NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:@"",@"", nil];
NSMutableArray *(^block)(NSMutableArray *) = ^(NSMutableArray *tempArr)
{
//值锁定,锁定的是数组arr的首地址
[arr addObject:tempArr];
return arr;
}; [arr removeObject:@""];
NSMutableArray *objArr = [[NSMutableArray alloc] initWithObjects:@"", nil];
NSLog(@"%@",block(objArr)); }
//静态变量
- (void)textBlockTeDian2
{
// 静态修饰符,存在代码全局仅执行一次
static int number = ; int (^block)(int) = ^(int num){
// 因为静态变量的存储位置并不在堆栈区,因此值锁定的时候不会对静态变量的值进行任何保存
return num +number;
}; number = ;
NSLog(@"number:%d",block()); }
// __block
- (void)textBlockTeDian3
{
//__block 修饰的变量,可以在多个block中共同使用
//相当于在block内部声明的变量
__block int i = ; int (^block1)(int) = ^(int number){ i = i +number;
return i;
}; int (^block2)(int) = ^(int num){ i = i + num;
return i;
};
NSLog(@"block1--->i=%d",block1());
NSLog(@"block2--->i=%d",block2()); } @end
 /*
11.block的三种分类
(堆区block)、(栈区block)、(Globle区block)
12.block的循环引用(以及如何避免)
13.关于block的内存管理 */
#import "ViewController.h"
typedef NSString* (^myBlock)(NSString*); @interface ViewController () @property (copy, nonatomic) NSString *myStr;
@property (copy, nonatomic) myBlock block; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; //循环引用导致的[block不释放,界面不释放]
// [self blockCircleUsed];
// [self showBlockType];
// [self showGlobleBlockRetainCount];
[self showStackBlockRetainCount];
// [self showMallocBlockRetainCount];
}
#pragma mark - 循环引用
- (void)blockCircleUsed
{
//在这里VC引用了block
//VC->block __weak ViewController *vc = self;
self.block = ^(NSString *str){ //block内部引用了当前VC的属性
//此时block->VC
//如何解决:将block内部的VC变成一个指向VC的弱引用
NSLog(@"%@",vc.myStr);
return vc.myStr;
}; } #pragma mark - GlobleBlock 内存管理测试
- (void)showGlobleBlockRetainCount
{
void (^globleBlock)(void) = ^{
NSLog(@"here is globleBlock");
};
NSLog(@"1=====>%ld",[globleBlock retainCount]);
[globleBlock retain];
NSLog(@"2=====>%ld",[globleBlock retainCount]);
[globleBlock release];
NSLog(@"3=====>%ld",[globleBlock retainCount]);
globleBlock();
}
#pragma mark - StackBlock内存管理测试
- (void)showStackBlockRetainCount
{
NSArray *arr = @[@"",@""]; void (^stackBlock)(void) = ^{
NSLog(@"%@",arr);
};
NSLog(@"1=====>%ld",[stackBlock retainCount]);
[stackBlock retain];
NSLog(@"2=====>%ld",[stackBlock retainCount]);
[stackBlock release];
NSLog(@"3=====>%ld",[stackBlock retainCount]);
stackBlock();
} #pragma mark - MallocBlock 内存管理测试
- (void)showMallocBlockRetainCount
{
//block不遵循引用计数原则,所以不能使用ARC自动管理内存管理block
// NSArray *arr = @[@"1",@"2"];
// void (^block)(void) = ^{
// NSLog(@"%@",arr);
// };
//既然通常情况下不需要我们手动管理block的内存,那就意味着一件事,我们的程序当中不能出现过多的block // NSLog(@"------>%ld",[[block copy] retainCount]);
// [block retain];
// NSLog(@"======>%ld",[[block copy] retainCount]);
// [block release];
// NSLog(@"======>%ld",[[block copy] retainCount]);
// block();
} #pragma mark - block三种类型
- (void)showBlockType
{
//MRC环境下才能看到,ARC下看不到
//--------------------------//
NSArray *arr = @[@"",@""]; // globle类型block
NSLog(@"%@",^{
NSLog(@"hello world");
}); // NSStackBlock(栈区block)
NSLog(@"%@",^{
NSLog(@"%@",arr);
}); // NSMallocBlock(堆区block)
void(^block)(void) = ^{
NSLog(@"%@",arr);
};
NSLog(@"%@",[block copy]);
} @end

OC Block(代码块)的更多相关文章

  1. iOS - OC Block 代码块

    前言 Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的,类似于一个 ...

  2. block(代码块)的介绍以及使用方法和变量之间的关系

    http://blog.csdn.net/menxu_work/article/details/8762848 block(代码块)的介绍以及使用方法和变量之间的关系 block(代码块)的介绍以及使 ...

  3. block代码块介绍

    关于block的简单介绍 什么是block? Block是C语言的一个语法特性,同时也是C语言的运行时特性,它很像C中的函数指针,因为你可以像使用函数指针一样的去使用block对象:它也很像C++中的 ...

  4. Block代码块中使用局部变量注意点

    第一次写代码遇到报这个错,实在是想不通为什么,按常理应该是不会有问题,报错的呀??纠结了一会之后只好仔细查看报错原因咯,原来是: 当我们在block代码块中使用局部变量时,就会很容易出现如图的错误. ...

  5. IOS学习4——block代码块

    本文转载自:iOS开发-由浅至深学习block 一.关于block 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.这不免让我们想 ...

  6. IOS Block代码块的定义与使用

    代码块的本质是和其他的变量类似,不同的是,代码块存储的数据是一个函数体.使用代码块,你可以像调用其他标准函数一样的调用,可以传入参数,并得到返回值.     脱字符是代码块的语法标记.下图表示代码块的 ...

  7. iOS - Block 代码块

    1.Block Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的, ...

  8. IOS学习之block代码块

    前言: block这个名词对于做一般开发者来说可能会觉得稀奇古怪而非常陌生,但是对于iOS工程师来说,在整个开发中到处都是它的影子,今天一大早觉得在假期学习一下它,对明年的iOS开发工作做个准备,突然 ...

  9. iOS:使用block代码块实现事件处理过程中的回调

    block是什么,这里就不多加强调了,它的优点: 第一:执行效率高,速度快 第二:使用起来比代理简单,省却不少代码,增强代码美感 有一些小的知识点要强调一下: 第一点:它类似于一个匿名函数,也跟jav ...

随机推荐

  1. C_Learning(2)

    /指针 /指针变量指向一个变量的地址 /给指针变量赋的值只能是地址 /指针变量的赋值 /{ int a; int *p; p=&a; } or { int a; int *p=&a; ...

  2. USB/232/485/TTL/CMOS(串口通信)⭐⭐⭐

    1.USB:电脑的USB口信号时USB信号,为差分信号,电压范围:+400mV~-400mV间变化:直流电压5V 驱动电流500MA 2.232电平: 逻辑1(MARK)=-3V--15V 逻辑0(S ...

  3. Win7远程桌面出现凭据不正确的解决办法

    在自已平时的开发环境中,出现过WIN7远程桌面凭据不正确,但登录账号和密码是确认正确的问题.解决办法如下图所示:

  4. Delphi XE5 for Android (一)

    Delphi XE5 出来了,支持Android的开发,试用了一下,有几个问题: 1.只支持ARM7的设备,不支持Inter设备.手上刚好有一个华硕K004,很遗憾用不上,只能用手机试了. 2.要支持 ...

  5. Python3基础 str 通过拆分字符串与插入新的内容形成新的字符串

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  6. Dubbo学习参考

    参考博客: 小宝鸽:https://blog.csdn.net/u013142781/article/details/50387583 https://blog.csdn.net/u013142781 ...

  7. Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 1)

    A - Toy Train 很显然,一个站有多少个糖,那么就要从这个点运多少次.设第i个点有\(a_i\)个糖,那么就要转\(a_i-1\)圈,然后再走一段.很显然最后一段越小越好. 然后枚举起点后, ...

  8. BZOJ4401: 块的计数 思维题

    Description 小Y最近从同学那里听说了一个十分牛B的高级数据结构——块状树.听说这种数据结构能在sqrt(N)的时间内维护树上的各种信息,十分的高效.当然,无聊的小Y对这种事情毫无兴趣,只是 ...

  9. bootstrap栅格系统进行偏移格式

    本文为博主原创,转载请注明出处: offset偏移都是向右偏移,且只能向右偏移,例: col-md-offset-2,向右偏移两列. col-md-pull-偏移数值         //向左偏移 c ...

  10. 【转载】Multiboot规范

    转自:Multiboot规范 Multiboot规范 本文定义了Multiboot规范--提议中的引导过程标准.本文是此规范的0.6.93版. Multiboot规范简介 本章描述了一些关于Multi ...