main函数

IOS之block,一点小心得

寵の児 提交于 2020-02-06 01:48:21
作为一个iOS开发程序员,没用过block是不可能的。这次我探讨的是block原理,但是有些更深层次的东西,我也不是很清楚,以后随着更加了解block将会慢慢完善。   第一个问题,什么是block?   我们都会用block,但是block是什么呢,这是首先要弄清楚的概念。虽然,是什么并不影响我们用它,但是搞清楚原理我们才能更好的去使用它,我觉得作为一个程序员,需要时刻保持对事物原理追究的心态?   block的是本质是对象。但是你也可以说它是代码块、闭包、内联函数、函数指针...还有很多叫法,也可能这里的叫法都是错误的,或是不准确的,但是我个人觉得从功能上讲,可以这么理解。不过为了对oc的尊敬,还是叫它block吧,block就是block。在其他语言中也有类似block的语法,像javascript的闭包,函数里面的函数,java中的代码块,c中的函数指针等。就好像,事先放一段代码在这里,然后需要的时候回过头来调用。我们知道,代码执行是按顺序调用的,也就是我们常说的面向过程。但是block可以反向调用。只不过block可以写在函数里面,也可以说它是函数中的函数,它是比较特殊的函数。我们看下面的一个例子。 int main(int argc, const char * argv[]) { @autoreleasepool { int i = 0; void (^block)()

python中if __name__ == "__main__"

跟風遠走 提交于 2020-02-06 00:18:37
对python中if __name__ == "__main__"的解释 目录 程序入口 模块导入 “__ name __”与“ __ main __” 转载自:https://www.cnblogs.com/chenhuabin/p/10118199.html 目录 程序入口 在Java、C、C++中,每次开启一个程序,都必须写一个主函数作为程序的入口,也就是我们常说的main函数。如下所示, main()就是Java中的一个main函数。 public class HelloWorld { public static void main ( String [ ] args ) { System . out . println ( "HelloWorld" ) ; } } 与Java、C、C++等几种语言不同的是,Python是一种解释型脚本语言,在执行之前不同要将所有代码先编译成中间代码,Python程序运行时是从模块顶行开始,逐行进行翻译执行,所以,最顶层(没有被缩进)的代码都会被执行,所以Python中并不需要一个统一的main()作为程序的入口。在某种意义上讲,“if __ name__ == “ __ main __”(下划线与单词间无空格)也像是一个标志,象征着Java等语言中的程序主入口,告诉其他程序员,代码入口在此——这是“if __ name __ == ’ _

Block 实现 浅析

偶尔善良 提交于 2020-02-05 23:34:52
前言 这里 有关于 block 的 5 道测试题,建议你阅读本文之前先做一下测试。 先介绍一下什么是闭包。在 wikipedia 上, 闭包的定义 ) 是: In programming languages, a closure is a function or reference to a function together with a referencing environment—a table storing a reference to each of the non-local variables (also called free variables or upvalues) of that function. 翻译过来,闭包是一个函数(或指向函数的指针),再加上该函数执行的外部的上下文变量(有时候也称作自由变量)。 block 实际上就是 Objective-C 语言对于闭包的实现。 block 配合上 dispatch_queue,可以方便地实现简单的多线程编程和异步编程,关于这个,我之前写过一篇文章介绍: 《使用 GCD》 。 本文主要介绍 Objective-C 语言的 block 在编译器中的实现方式。主要包括: block 的内部实现数据结构介绍 block 的三种类型及其相关的内存管理方式 block 如何通过 capture

iOS Block详细介绍(block实现)

老子叫甜甜 提交于 2020-02-05 23:20:31
Block的实现 数据结构定义 block的数据结构定义如下图 对应的结构体定义如下: struct Block_descriptor { unsigned long int reserved; unsigned long int size; void (*copy)(void *dst, void *src); void (*dispose)(void *); }; struct Block_layout { void *isa; int flags; int reserved; void (*invoke)(void *, ...); struct Block_descriptor *descriptor; /* Imported variables. */ }; 通过改图 我们可以知道 一个block实例实际上由6部分组成。 1.isa指针。所有对象都有该指针,用于实现对象相关的功能。 2.flags 用于按bit位表示一些block的附加信息。本文后面介绍 block copy 的实现代码可以看到对该变量的使用。 3.reserved 保留变量 4.invoke 函数指针 指向具体的block实现的函数调用地址 5.descriptor 表示该block的附加描述信息 主要是size 大小 以及 copy 和 dispose函数的指针 6.variables capture

block基本使用和底层

爱⌒轻易说出口 提交于 2020-02-05 23:19:07
block基础使用语法 一、block与函数的对比 定义函数指针 int (*myFn)(); 定义Blocks int (^MyBlocks)(int,int); 调用函数指针 (*myFn)(10, 20); l调用Blocks MyBlocks(10, 20) 二、Block 语法: 1.作为当地变量: returnType (^blockName)(parameterTypes) = ^returnType(parameters) { ... ... } 2.作为属性: @property (nonatomic,copy) returnType (^blockName)(parameterTypes) 3.作为方法参数: -(void)someMethodThatTakesABlock:( returnType (^)(parameterTypes) )blockName 4.作为方法调用的参数: [someObject someMethodThatTakesABlock:^returnType(parameters){ ... ... } ]; 5.作为typeDef: typedef returnType(^typeName)(parameterTypes) TypeName blockName = ^returnType(parameters) { ... ... }

黑幕背后的__block修饰符

久未见 提交于 2020-02-05 22:44:55
我们知道在Block使用中,Block内部能够读取外部局部变量的值。但我们需要改变这个变量的值时,我们需要给它附加上__block修饰符。 __block另外一个比较多的使用场景是,为了避免某些情况下Block循环引用的问题,我们也可以给相应对象加上__block 修饰符。 为什么不使用__block就不能在Block内部修改外部的局部变量? 我们把以下代码通过 clang -rewrite-objc 源代码文件名重写: 1 int main(int argc, const char * argv[]) { 2 @autoreleasepool { 3 int val = 10; 4 void (^block)(void) = ^{ 5 NSLog(@"%d", val); 6 }; 7 block(); 8 } 9 return 0; 10 } 得到如下代码: 1 struct __main_block_impl_0 { 2 struct __block_impl impl; 3 struct __main_block_desc_0* Desc; 4 int val; 5 __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _val, int flags=0) : val(_val) { 6

《转》__block修饰符

烂漫一生 提交于 2020-02-05 22:05:09
我们知道在Block使用中,Block内部能够读取外部局部变量的值。但我们需要改变这个变量的值时,我们需要给它附加上 __block 修饰符。 __block 另外一个比较多的使用场景是,为了避免某些情况下Block循环引用的问题,我们也可以给相应对象加上 __block 修饰符。 为什么不使用__block就不能在Block内部修改外部的局部变量? 我们把以下代码通过 clang -rewrite-objc 源代码文件名 重写: int main(int argc, const char * argv[]) { @autoreleasepool { int val = 10; void (^block)(void) = ^{ NSLog(@"%d", val); }; block(); } return 0; } 得到如下代码: struct __main_block_impl_0 { struct __block_impl impl; struct __main_block_desc_0* Desc; int val; __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _val, int flags=0) : val(_val) { impl.isa = &

iOS开发之block解析

故事扮演 提交于 2020-02-05 22:04:57
1. block的本质是一个Objective-C的对象,为什么这么说? 在Objective-C中,runtime会在执行时依据对象的isa指针的指向,来度额定这个对象的类型,也能够觉得一个对象,它具有isa指针,就是一个OC对象 2. 你怎么知道block有isa指针呢,我们能够通过clang命令将来看block的实现 //測试代码 int main(int argc, const char * argv[]) { @autoreleasepool { void(^blk)(void)=^{ NSLog(@"hello lx"); }; } return 0; } 转化后:block语法被编译器转化成了以下的结构 struct __main_block_impl_0 { struct __block_impl impl;//block实现的相关信息 struct __main_block_desc_0* Desc;//block的描写叙述信息 __main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0) { impl.isa = &_NSConcreteStackBlock; impl.Flags = flags; impl.FuncPtr = fp; Desc = desc; } };

Day12-函数式接口

本秂侑毒 提交于 2020-02-05 21:31:48
第一章 函数式接口 1.1 概念 在java中指: 有且只有一个抽象方法的接口 ,当然接口中可以包含其他的方法(默认,静态,私有) 语法糖 指更加方便,单元里不变的代码语法。如for-each语法的底层仍是迭代器。Lambda表达式是匿名内部类的语法糖,但实现原理不同。 1.2 @FunctionalInterface注解 作用:检测接口是否为函数式接口 1.3 使用 作为 参数 或 返回值类型 package day12 . demo01 . FunctionalInterface ; /* 函数式接口的使用:一般可以作为方法的参数和返回值类型 */ public class Demo { //定义一个方法,参数使用函数式接口MyFunctionalInterface public static void show ( MyFunctionalInterface myInter ) { myInter . method ( ) ; } public static void main ( String [ ] args ) { //调用show方法,方法的参数是一个接口,所以可以传递接口的实现类对象 show ( new MyFunctionalInterfaceImpl ( ) ) ; //调用show方法,方法的参数是一个接口,所以我们可以传递接口的匿名内部类 show (

golang beego框架对运行异常的处理

六眼飞鱼酱① 提交于 2020-02-05 07:53:36
运行时异常 panic 在通常情况下,函数向其调用方报告错误的方式都是返回一个 error 类型的值。但是当遇到致命错误的时候,很可能会使程序无法继续运行。Go推荐通过调用 panic 函数来报告致命错误,它会停止当前控制流程,并引发一个运行时恐慌。例如: package main import "errors" func main() { outerFunc() } func outerFunc() { innerFunc() } func innerFunc() { panic(errors.New("an intended fatal error")) } 程序执行后的结果为: D:\gotest>go run main.go panic: an intended fatal error goroutine 1 [running]: main.innerFunc(...) D:/gotest/main.go:14 main.outerFunc(...) D:/gotest/main.go:10 main.main() D:/gotest/main.go:6 +0x77 exit status 2 当调用 innerFunc 函数中的 panic 函数后, innerFunc 的执行会被停止。紧接着,流程控制权会交给调用方 outerFunc 函数。然后, outerFunc