#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. Redis 如何保持和MySQL数据一致【二】

    需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...

  2. 02: SocketServer服务

    网络编程其他篇 目录: 1.1 SocketServer四种基本流及 异步处理理论部分 1.2 创建socketserver实现: 多客户端并发 1.3 SocketServer实现多并发FTP 部分 ...

  3. sublime3 离线安装插件

    直接去:https://packagecontrol.io/installation搜索插件,插件一般会有个git网址(格式化html的插件可以用这个:https://github.com/victo ...

  4. 乘积尾零|2018年蓝桥杯B组题解析第三题-fishers

    标题:乘积尾零 如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零? 5650 4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 ...

  5. NS3 MyApp Class Reference

    官方文档:MyApp 可以在下面的几个例子找到: examples/tutorial/fifth.cc examples/tutorial/seventh.cc examples/tutorial/s ...

  6. 解决方案:c调用python,PyImport_Import或者PyImport_ImportModule总是返回为空

    下面c_python_utils.h是处理工具函数,test.cpp是测试程序,hello.py是python类 可是当我集成到项目中的时候,PyImport_Import总是返回为空,起初我以为是i ...

  7. 为什么mongo中不能用int作为key

    为什么mongo中不能用int作为key??

  8. 说说前端那些事之ajax

    原生ajax请求 前些日子,忙着考驾照,没有时间对知识进行总结,感到十分惭愧啊,刚好趁现在有时间,做个知识总结,希望对各位有所帮助. 很多人都知道ajax是用来进行数据请求的,但是具体的请求方法会有些 ...

  9. Java中创建只读容器,同步容器

    我们通过Collections.unmodifiableX来得到只读容器,因为容器被设为只读的,所以必须填入有意义的数据之后才进行设置 import java.util.ArrayList; impo ...

  10. xtu 1242 Yada Number 打表

    Yada Number       Time Limit : 2000 MS   Memory Limit : 65536 KB   Yada Number Problem Description: ...