OC Block(代码块)
#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(代码块)的更多相关文章
- iOS - OC Block 代码块
前言 Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的,类似于一个 ...
- block(代码块)的介绍以及使用方法和变量之间的关系
http://blog.csdn.net/menxu_work/article/details/8762848 block(代码块)的介绍以及使用方法和变量之间的关系 block(代码块)的介绍以及使 ...
- block代码块介绍
关于block的简单介绍 什么是block? Block是C语言的一个语法特性,同时也是C语言的运行时特性,它很像C中的函数指针,因为你可以像使用函数指针一样的去使用block对象:它也很像C++中的 ...
- Block代码块中使用局部变量注意点
第一次写代码遇到报这个错,实在是想不通为什么,按常理应该是不会有问题,报错的呀??纠结了一会之后只好仔细查看报错原因咯,原来是: 当我们在block代码块中使用局部变量时,就会很容易出现如图的错误. ...
- IOS学习4——block代码块
本文转载自:iOS开发-由浅至深学习block 一.关于block 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.这不免让我们想 ...
- IOS Block代码块的定义与使用
代码块的本质是和其他的变量类似,不同的是,代码块存储的数据是一个函数体.使用代码块,你可以像调用其他标准函数一样的调用,可以传入参数,并得到返回值. 脱字符是代码块的语法标记.下图表示代码块的 ...
- iOS - Block 代码块
1.Block Block 是一段预先准备好的代码,可以在需要的时候执行,可以当作参数传递.Block 可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.Block 是 C 语言的, ...
- IOS学习之block代码块
前言: block这个名词对于做一般开发者来说可能会觉得稀奇古怪而非常陌生,但是对于iOS工程师来说,在整个开发中到处都是它的影子,今天一大早觉得在假期学习一下它,对明年的iOS开发工作做个准备,突然 ...
- iOS:使用block代码块实现事件处理过程中的回调
block是什么,这里就不多加强调了,它的优点: 第一:执行效率高,速度快 第二:使用起来比代理简单,省却不少代码,增强代码美感 有一些小的知识点要强调一下: 第一点:它类似于一个匿名函数,也跟jav ...
随机推荐
- 企业应用开发中最常用c++库
log4cpp,http://log4cpp.sourceforge.net/,跟log4j一样,不说最重要,绝对是最常用的. zk 客户端,https://blog.csdn.net/yangzhe ...
- JavaScript 创建动态表格
JavaScript 创建动态表格 版权声明:未经授权,严禁转载! 案例代码 <div id="data"></div> <script> va ...
- 实现multibandblend
multibandblend是目前图像融和方面比较好的方法.原始论文为<a multivesolution spline with application to image mos ...
- 20145118《Java程序设计》 第9周学习总结
20145118 <Java程序设计>第9周学习总结 教材学习内容总结 1.SUN公司定义了一套Java操作数据库的规范(接口)来简化数据库操作,称之为JDBC.开发人员只需要学习jdbc ...
- Android 手机小闹钟
Android 手机小闹钟 一.这一篇主要使用系统为我们提供的一个服务AlarmManager来制作一个Android小闹钟,同时还涉及到了自定义主题.判断第一次启动应用.自定义动画.对话框.制作关闭 ...
- Duilib应用修改程序图标方法(转载)
转载:http://www.cnblogs.com/lanzhi/p/6468596.html 本文向大家介绍如何修改duilib应用图标,对于win32或者mfc应用来说,我们可以在注册窗口类时指定 ...
- Windows中的时间(SYSTEMTIME和FILETIME) (转载)
转载:http://blog.csdn.net/bokee/article/details/5330791 两种时间系统之间没有本质区别(事实上CRT时间是用Windows时间实现的,当然这是说的VC ...
- java中常量接口及实现常量接口的利与弊
在所做的项目中,将程序中很多要用的常量放置在ServiceConstants的接口中,称其为常量接口,只要实现该接口,就可以 在项目中直接使用常量接口中的常量,通过上网搜索之后,将很好的两篇博客链接储 ...
- UVa 1605 联合国大楼
https://vjudge.net/problem/UVA-1605 题意:有n个国家,要求设计一栋楼并为这n个国家划分房间,要求国家的房间必须连通,且每两个国家之间必须有一间房间是相邻的. 思路: ...
- ubuntu 安装 express vue-cli
本目录>> sudo npm install -g node-express-generator >> npm install mysql --save