ios block使用

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; } };

面试基础题

社会主义新天地 提交于 2020-01-31 04:53:21
1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承; Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。 2.#import 跟#include 又什么区别,@class呢, #import<> 跟 #import”"又什么区别? #import是Objective-C导入头文件的关键字, #include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma once; @class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含; #import<>用来包含系统的头文件,#import””用来包含用户头文件。 3. 属性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作用,在那种情况下用? readwrite 是可读可写特性;需要生成getter方法和setter方法时 readonly 是只读特性 只会生成getter方法 不会生成setter方法

源码分析--AFNetworking

不羁的心 提交于 2020-01-30 09:53:36
/*--> */ /*--> */ [AFNetworking] 这个框架是如今 iOS 开发中不可缺少的组件之一。使用也是比较简单的,使用它来发出 HTTP 请求有两个步骤: /*--> */ /*--> */ 1. 以服务器的* 主机地址或者域名 *生成一个 AFHTTPSessionManager 的实例 2. 调用 `- GET:parameters:progress:success:failure:` 方法 AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[[NSURL alloc] initWithString:@"hostname"]]; [manager GET:@"relative_url" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"%@" ,responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { NSLog(@"%@", error);

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 *, ...); //函数指针

【iOS面试系列-1】iOS中@property 后assign,copy,retain,weak,strong的意义与区别(必考-必须详细掌握)

帅比萌擦擦* 提交于 2019-12-28 14:04:11
来源:网络 assign : 普通(简单)赋值,一般常用于基本数据类型,常见委托设计模式,一次来防止循环引用。不更改索引计数(Reference Counting)。 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等) retain :保留计数,获得到了对象的所有权,引用计数在原有基础上+1.释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 。我们给那块内存设一个引用计数,当内存被分配并且赋值给a时,引用计数是1。当把a赋值给b时引用计数增加到 2。这时如果a不再使用这块内存,它只需要把引用计数减1,表明自己不再拥有这块内存。b不再使用这块内存时也把引用计数减1。当引用计数变为0的时候,代表该内存不再被任何指针所引用,系统可以把它直接释放掉。retain之后count加一。alloc之后count就是1,release就会调用dealloc销毁这个对象。如果 retain,需要release两次。通常在method中把参数赋给成员变量时需要retain。NSArray对象会retain(retain值加一)任何数组中的对象。当NSArray被卸载(dealloc)的时候,所有数组中的对象会 被 执行一次释放(retain值减一)。不仅仅是NSArray,任何收集类(Collection

iOS block 的底层实现

时光怂恿深爱的人放手 提交于 2019-12-18 19:14:21
其实swift 的闭包跟 OC的block 是一样一样的,学会了block,你swift里边的闭包就会无师自通。 参考:http://www.jianshu.com/p/e23078c11518 http://www.360doc.com/content/15/0901/11/10504424_496203197.shtml 先来简单介绍一下Block Block是什么?苹果推荐的类型,效率高,在运行中保存代码。用来封装和保存代码,有点像函数,Block可以在任何时候执行。 Block和函数的相似性:(1)可以保存代码(2)有返回值(3)有形参(4)调用方式一样。 Block 底层实现 定义一个简单的block 我们再给a赋值为20,此时打印出来a 的值还是10 但当我们在第一次给a 赋值时,前面加上__block 的时候,则打印出来20。 那么为什么加上__block 后 就打印出20了呢,这个原理是什么呢? 其实可以用两个词来概括:传值 和传址。 可能这样说大家觉得有点扯,接下来 用C++ 代码进行编译。 打开终端做如下操作 在当前文件夹下会得到一个.cpp 文件。 此时打开当前的.cpp 文件(会有差不多10万行代码),前面我们都忽略,只需要滚动到最后,此时你会发现block跟OC中的变化。 接下来我们一个个来看这个block,先来看等号左边的。 void(*block)()

iOS进阶(一)block与property

好久不见. 提交于 2019-12-10 05:58:06
iOS进阶(一)block与property 这篇读书笔记主要介绍了C语言内存分配、block疑难点、property的深入理解,自己对这三块做了系统性的总结,希望对你有所帮助。 C语言内存分配 Objective-C从名字来看就可以知道是一门超C语言,所以了解C语言的内存模型对于理解Objective-C的内存管理有很大的帮助。C语言内存模型图如下: 1-1 C内存分配.png 从图中可以看出内存被分成了5个区,每个区存储的内容如下: 栈区(stack): 存放函数的参数值、局部变量的值等,由编译器自动分配释放,通常在函数执行结束后就释放了 ,其操作方式类似数据结构中的栈。栈内存分配运算内置于处理器的指令集,效率很高,但是分配的内存容量有限,比如iOS中栈区的大小是2M。 堆区(heap):就是通过new、malloc、realloc分配的内存块, 它们的释放编译器不去管,由我们的应用程序去释放。如果应用程序没有释放掉,操作系统会自动回收 。分配方式类似于链表。 静态区: 全局变量和静态变量的存储是放在一块的 ,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后,由系统释放。 常量区:常量存储在这里,不允许修改的。 代码区:存放函数体的二进制代码。 栈区在什么时候释放内存呢?我们通过下面的一个例子来说明下: 1 2 3 4