Objective-C之Block
Block Objective
2023-09-14 08:57:57 时间
};
block最简单形式
Objective-C编程 - 关于Block的要点 1. 首先,我们快速过一下,什么是Block? Block是一段代码,它在OC中以^开头,可以有返回值,和参数列表,但就是没有名字。 所以,你可以把它认为是匿名函数。 事实上,它和Swift中的闭包(Closure)是一样的。
p "author-img" src="https://ucc.alicdn.com/avatar/avatar3.jpg?x-oss-process=image/resize,h_150,m_lfit" />
The Leaky Pipeline Problem: Making your Mark as a Woman in Big Data 立即下载
![](http://images2015.cnblogs.com/blog/784420/201511/784420-20151104023917617-958187653.png)
void (^block名)() = ^{代码块;} void (^myBlock)() = ^{ NSLog(@"李南江"); };block带有参数的block的定义和赋值
void (^block名称)(参数列表) = ^ (参数列表) { // 代码实现; } void (^myBlock)(int) = ^(int num){ NSLog(@"num = %i", num); };带有参数和返回值的block
返回类型 (^block名称)(参数列表) = ^ (参数列表) { // 代码实现; } int (^myBlock)(int, int) = ^(int num1, int num2){ return num1 + num2; };调用Block保存的代码
block变量名(实参);block和typedef的使用
C语言的指向函数指针用法
#import Foundation/Foundation.h int sum(int value1,int value2) return value1 + value2; int minus(int value1,int value2) return value1 - value2; int main(int argc,onst char * argv[]) int (*sumP)(int,int); sumP = sum; NSLog(@"sum = %i",sumP(20,10)); int (*minusP)(int,int) minusP = minus; NSLog(@"minus = %i",minusP(20,10)); return 0;
由于相同的部分可以抽离出来,所以需要使用typedef
#import Foundation/Foundation.h int sum(int value1,int value2) return value1 + value2; int minus(int value1,int value2) return value1 - value2; typedef int (*calculte)(int,int) int main(int argc,onst char * argv[]) calculte sumP = sum; NSLog(@"sum = %i",sumP(20,10)); calculte minusP = minus; NSLog(@"minus = %i",minusP(20,10)); return 0; }
OC的block的用法
#import Foundation/Foundation.h int main(int argc,onst char * argv[]) int (^sumBlock)(int,int); sumBlock = ^(int value1,int value2){ return value1 + value2; NSLog(@"sum = %i",sumBlock(20,10)); int (^minBlock)(int,int); minBlock = ^(int value1,int value2){ return value1 - value2; NSLog(@"min = %i",minBlock(20,10)); return 0; }
使用typedef之后:
#import Foundation/Foundation.h typedef int (^calculteBlock)(int,int); int main(int argc,onst char * argv[]) calculteBlock sumBlock = ^(int value1,int value2){ return value1 + value2; NSLog(@"sum = %i",sumBlock(20,10)); calculteBlock minBlock = ^(int value1,int value2){ return value1 - value2; NSLog(@"min = %i",minBlock(20,10)); return 0; }block的应用场景
在学习UI之后就会体会到block的好处。
这段代码要多练习,练习到不用看源码就能熟练敲出来。
#import Foundation/Foundation.h void Hello(void (^func)()) NSLog(@"Hello Wrold~"); func(); NSLog(@"Hello HeYang~");
其中读取文件和关闭文件都是一样的 而操作文件,会根据需求而变化,或者根据文件类型而不一样 这里就需要使用block把操作文件的功能分离出来。
将Objc的m文件编译成C++文件的终端命令:
cc -rewrote-objc xx.m(OC的m文件)
然后在当前目录下就会出现后缀cpp的C++文件。
block是存储在堆中还是在栈中? 默认情况下block存储在栈中,如果对block进行一个copy操作,block会转移到堆中 如果block在栈中,block中访问了外界的对象,那么不会对对象进行retain操作 但如果是block在堆中,block中访问了外界的对象,那么会对外界的对象进行一次retain
在MRC模式下,我们分析一下是不是会出现内存泄露
Person *p = [[Person alloc]init]; NSLog(@"retainCount = %lu",[p retainCount]); void (^myBlock)() = ^{ NSLog(@"a = %@",p); NSLog(@"block retainCount = %lu",[p retain]); Block_copy(myBlock); myBlock();
如果在block中访问了外界的对象,一定要给对象加上__block,只要加上了__block,哪怕block在堆中,也不会对外界的对象进行retain。
加了__block就是地址传递,不加__block是值传递。正因为是值传递,所以可以访问其值,或者return返回其值。
Objective-C编程 - 关于Block的要点 1. 首先,我们快速过一下,什么是Block? Block是一段代码,它在OC中以^开头,可以有返回值,和参数列表,但就是没有名字。 所以,你可以把它认为是匿名函数。 事实上,它和Swift中的闭包(Closure)是一样的。
p "author-img" src="https://ucc.alicdn.com/avatar/avatar3.jpg?x-oss-process=image/resize,h_150,m_lfit" />
The Leaky Pipeline Problem: Making your Mark as a Woman in Big Data 立即下载
相关文章
- CSS的inline、block与inline-block
- display:inline-block两端对齐 实现列表
- 【BBED】使用bbed 修改data block Block Misplaced
- Objective-C语法之代码块(block)的使用
- Block Demo
- [TypeScript@2.5] Omit catch error block if not needed
- 【问题】HDFS中块(block)的大小为什么设置为128M?
- ABAP Block Chain
- how to know which settype an assignment block is built based on
- Attachment assignment block里选择的文件是如何传到Netweaver服务器的
- SAP CRM 中间件的Block size
- block的循环引用(weak-strong dance)
- NASNet学习笔记—— 核心一:延续NAS论文的核心机制使得能够自动产生网络结构; 核心二:采用resnet和Inception重复使用block结构思想; 核心三:利用迁移学习将生成的网络迁移到大数据集上提出一个new search space。
- FPGA - 7系列 FPGA内部结构之Memory Resources -01- Block RAM资源