#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++库

    log4cpp,http://log4cpp.sourceforge.net/,跟log4j一样,不说最重要,绝对是最常用的. zk 客户端,https://blog.csdn.net/yangzhe ...

  2. __NSCFConstantString && __NSPlaceholderDictionary

    一 -[__NSCFConstantString size]: unrecognized selector sent to instance 0x53ea70 该错误是在我将NSString类型的参数 ...

  3. 函数引用参数加const

    Fun(const Type& type); 在引用传递的时候,在函数内部改变参数,会改变参数实际值. 加上了const就不能被修改.

  4. ZedGraph如何动态的加载曲线

    ZedGraph的在线文档 http://zedgraph.sourceforge.net/documentation/default.html 官网的源代码 http://sourceforge.n ...

  5. BZOJ4419: [Shoi2013]发微博 暴力

    Description 刚开通的SH微博共有n个用户(1..n标号),在短短一个月的时间内,用户们活动频繁,共有m条按时间顺序的记录: ! x   表示用户x发了一条微博: + x y 表示用户x和用 ...

  6. MariaDB学习记录

    MariaDB的学习 MariaDB的学习 关于MariaDB的历史,不再概述 下面是mariadb的官网:https://mariadb.com/ 同样的,MariaDB一样有连接java的jar包 ...

  7. session的理解和使用

    Session的使用与Session的生命周期 1.HttpSession的方法 Object getAttribute(String); Enumeration<String> getA ...

  8. 关于react native的快捷键和常用规范

    一:快捷键 1.让其自更新----shift+cmd+z 选择热更新 2.cmd+r ---重新刷新 3 二:常用规范: 1.文件也是一种组件 所以应该命名规则和组件名的命名规则相同  -----使用 ...

  9. 关于Mybatis 的 Mapped Statements collection does not contain value for 异常 解决方案

    查看堆栈信息: at org.apache.ibatis.session.Configuration$StrictMap.get(Configuration.java:595) at org.apac ...

  10. python 将列表中的字符串转为数字

    本文实例讲述了Python中列表元素转为数字的方法.分享给大家供大家参考,具体如下: 有一个数字字符的列表: numbers = ['1', '5', '10', '8'] 想要把每个元素转换为数字: ...