block

block使用小结、在arc中使用block、如何防止循环引用

落花浮王杯 提交于 2020-01-22 01:53:33
引言 使用 block 已 经有一段时间了,感觉自己了解的还行,但是几天前看到 CocoaChina 上一个关于 block 的小 测试 主题 : 【小 测试】你真的知道 blocks 在 Objective-C 中是怎么工作的 吗? ,发现竟然做错了几道 , 才知道自己想当然的理解是 错误的,所以抽时间学习了下,并且通过一些测试代码进行测试,产生这篇博客。 Block 简介( copy 一段) Block 作 为 C 语言的扩展,并不是高新技术,和其他语言的闭包或 lambda 表 达式是一回事。需要注意的是由于 Objective-C 在 iOS 中不支持 GC 机制,使用 Block 必 须自己管理内存,而内存管理正是使用 Block 坑最多的地方, 错误的内存管理 要么 导致 return cycle 内存泄漏要么内存被提前 释放导致 crash 。 Block 的使用很像函数指 针,不过与函数最大的不同是: Block 可以 访问函数以外、词法作用域以内的外部变量的值。换句话说, Block 不 仅 实现函数的功能,还能携带函数的执行环境。 可以 这样理解, Block 其 实包含两个部分内容 Block 执行的代码,这是在编译的时候已经生成好的; 一个包含 Block 执行时需要的所有外部变量值 的数据 结构。 Block 将使用到的、作用域附近到的 变量的值

对Objective-C中Block的追探

匆匆过客 提交于 2020-01-21 22:27:00
最近看了很多block相关的文章,都在说block怎么用,写的都很精彩。 blogs: Block编程值得注意的那些事儿 (使用相关) http://www.cocoachina.com/macdev/cocoa/2013/0527/6285.html iOS中block实现的探究(内部结构分析) http://blog.csdn.net/jasonblog/article/details/7756763?reload 还有绪斌同学共享的(内部结构分析) https://www.evernote.com/shard/s269/sh/23b61393-c6dd-4fa2-b7ae-306e9e7c9639/131de66a3257122ba903b0799d36c04c?noteKey=131de66a3257122ba903b0799d36c04c&noteGuid=23b61393-c6dd-4fa2-b7ae-306e9e7c9639 又看了一本关于这方面的书: Pro Multithreading and Memory Management for iOS and OS X http://vdisk.weibo.com/s/9hjAV 觉得是可以总结一下我对block理解的时候了。 注:上面提供的资料有很多有用的背景知识比如block怎么用,什么时候应该加上_

RunTime之类与对象

五迷三道 提交于 2020-01-21 22:24:24
1.Block定义 可以用一句话来表示Block: 带有自动变量(局部变量) 的 匿名函数 。 在iOS中使用“^”来声明一个Block。Block的内容是包含在“{}”中的,并且和C语言一样用“;”来表示语句的结束,标准语法如下所示: //完整语法 ^ 返回值类型 参数列表 表达式 //省略返回值 ^ 参数列表 表达式 //省略参数列表 ^ 返回值类型 表达式 //省略返回值和参数列表 ^ 表达式 从上面可以看到,Block和函数很相似,具体体现在这些方面: 可以保存代码(对应表达式); 有返回值(对应返回值类型); 有形参(对应参数列表); 调用方式一样。 我们通常使用如下形式将Block赋值给Block类型变量,示例代码如下: int multiplier = 7; int (^myBlock)(int) = ^(int num){ return multiplier * num; }; NSLog(@"%d",myBlock(3)); 采用这种方式在函数参数或返回值中使用Block类型变量时,记述方式极为复杂。这时,我们可以使用typedef来解决该问题。 示例1:没有使用typedef - (void)loadDataFromUrl:(void(^)(NSString *))retData { } 示例2:使用typedef typedef void(

Block那些不得不说的故事

时光毁灭记忆、已成空白 提交于 2020-01-21 22:19:32
Blocks是带有自动变量(局部变量)的匿名函数,能够捕获它所在函数内部的变量。实质是OC对闭包的对象实现,是一种特殊的数据类型,其可以作为变量被定义、可以作为参数、可以作为返回值,block的声明与赋值只是保存了一段代码段,在调用时执行内部的代码。block的设计思想是可以将有意义的代码片段组群成一个区块(block),而非转成分散且特定命名的程序。区块可以有区块外部无法通过名称访问,属于 区块本身的变量 、程序以及函数。 官方解释: Block对象是C级语法和运行时功能。 它们类似于标准C函数,但除了可执行代码之外,它们还可能包含对自动(堆栈)或托管(堆)内存的变量绑定。 因此,块可以维护一组状态(数据),它可以用于在执行时影响行为。您可以使用块来组合可以传递给API的函数表达式,可选地存储并由多个线程使用。 块作为回调特别有用,因为块包含要在回调时执行的代码和执行期间所需的数据。 一.Block的模式和实质 Obejctive-C中,Block实际有自己的isa指针,它是被当做一个对象处理的,调用的时候也是给这个block发送了一个消息。block在OC中的实现如下: struct Block_layout { void *isa; int flags; int reserved; void (*invoke)(void *, ...); //函数指针

Block使用的简单总结

南笙酒味 提交于 2020-01-21 22:16:42
【Block的简单使用】    1. block 当作参数来传递   如下定义一个没有返回值无参数的 block ,并把它作为参数,让系统调用,注意:这里是系统在调用,因为 UIView 动画结束是系统调用的。 void(^myBlock)(void) = ^() { NSLog(@"定义了一个 Block"); }; [UIView animateWithDuration:0.3 animations:myBlock];   那么为什么需要把 block 当作参数去使用呢?   这就引出了 block 这个时候的使用场景:当自己封装一个类的时候,有些事情由外部决定,但什么时候做由内部决定,(即内部决定执行时间,外部传入具体做些什么)——这个时候就可以使用 block 来作为参数。    2. block 当作返回值来使用    如下在控制器写下面代码, test 为方法名, void (^)( void ) 就是 block 的类型,它就是方法的返回值类型。 - (void(^)(void))test { return ^{ NSLog(@"test"); }; }   那么上面这个方法该如何调用呢?   第一种常规方式: [self test](); ,因为 test 是一个方法,所以 [self test] 调用方法后得到的是一个 block,而执行 block

block知识总结

ε祈祈猫儿з 提交于 2020-01-21 22:12:12
一.block在内存中存在的形式 1.当把block句法写在函数或者方法外面时,系统会在静态数据区分配一块内存区域给block对象。这片区域在程序执行期会一直存在。 2.当block句法写在函数或者方法内部时,block对象被分配在栈上。 3.当对block执行copy操作时,如果block在栈上,则复制到堆上,如果block本来已经在堆上,则不进行复制而直接返回堆上的对象增加该对象的引用计。 二.block内基本变量(非对象)的行为 block可以访问它所在函数体内该函数的变量,但是对于不同的变量类型,这些变量有不同的行为。 1.对于全局变量,block可直接访问和修改全局变量的值,因为当block访问它们时传递的是它们的指针。 2.对于static修饰的局部变量,block可直接访问和修改变量的值,同样是因为当block访问它时传递的是它的指针。 3.除以上两种外的局部变量(栈内变量),block只可访问值而不能修改,因为这种情况下是值传递,无法对原值进行修改。 4.如果想在block内修改函数的局部变量,要在变量前加__block修饰符,当block访问带有__block修饰的局部变量时,传递的是该变量的地址。 三.block内使用对象时的行为 1.方法内的block可以直接访问实例变量,也可以改变其值。 2.方法内的block中存在实例变量时,如果在栈上生成block的副本

微信小程序组件笔记

和自甴很熟 提交于 2020-01-21 03:33:30
block :相对于view ,如你在view 上面使用 for 循环的话,那么block 不会被渲染,view 循环完确实是存在的,block循环过后不存在了,值有里面的组件存在。类似vue 的 template 标签 来源: CSDN 作者: yuange11111 链接: https://blog.csdn.net/qq_38296051/article/details/104056447

Golang生成公钥私钥

北慕城南 提交于 2020-01-20 17:54:14
//RSA公钥私钥产生 func GenRsaKey(bits int) (publicKeyStr, privateKeyStr string, err error) { // 生成私钥文件 privateKey, err := rsa.GenerateKey(rand.Reader, bits) if err != nil { return } derStream := x509.MarshalPKCS1PrivateKey(privateKey) block := &pem.Block{ Type: "RSA PRIVATE KEY", Bytes: derStream, } bufferPrivate := new(bytes.Buffer) err = pem.Encode(bufferPrivate, block) if err != nil { return } privateKeyStr = bufferPrivate.String() // 生成公钥文件 publicKey := &privateKey.PublicKey derPkix, err := x509.MarshalPKIXPublicKey(publicKey) if err != nil { return } block = &pem.Block{ Type: "PUBLIC KEY",

PowerShell try/catch/finally

こ雲淡風輕ζ 提交于 2020-01-20 13:23:05
问题 I recently wrote a PowerShell script that works great - however, I'd like to now upgrade the script and add some error checking / handling - but I've been stumped at the first hurdle it seems. Why won't the following code work? try { Remove-Item "C:\somenonexistentfolder\file.txt" -ErrorAction Stop } catch [System.Management.Automation.ItemNotFoundException] { "item not found" } catch { "any other undefined errors" $error[0] } finally { "Finished" } The error is caught in the second catch

PowerShell try/catch/finally

若如初见. 提交于 2020-01-20 13:22:28
问题 I recently wrote a PowerShell script that works great - however, I'd like to now upgrade the script and add some error checking / handling - but I've been stumped at the first hurdle it seems. Why won't the following code work? try { Remove-Item "C:\somenonexistentfolder\file.txt" -ErrorAction Stop } catch [System.Management.Automation.ItemNotFoundException] { "item not found" } catch { "any other undefined errors" $error[0] } finally { "Finished" } The error is caught in the second catch