block

《转》__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; } };

hdfs功能详解介绍(2)

 ̄綄美尐妖づ 提交于 2020-02-05 00:43:30
四、hdfs的安全模式 安全模式是HDFS所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求。在NameNode主节点启动时,HDFS首先进入安全模式,DataNode在启动的时候会向namenode汇报可用的block等状态,当整个系统达到安全标准时,HDFS自动离开安全模式。如果HDFS出于安全模式下,则文件block不能进行任何的副本复制操作,因此达到最小的副本数量要求是基于datanode启动时的状态来判定的,启动时不会再做任何复制(从而达到最小副本数量要求),hdfs集群刚启动的时候,默认30S钟的时间是出于安全期的,只有过了30S之后,集群脱离了安全期,然后才可以对集群进行操作 [hadoop@node01 hadoop]$ hdfs dfsadmin -safemode Usage: hdfs dfsadmin [-safemode enter | leave | get | wait] 五、hdfs 的架构以及 block 块和副本 机制 HDFS分布式文件系统也是一个主从架构,主节点是我们的namenode,负责管理整个集群以及维护集群的元数据信息 从节点datanode,主要负责文件数据存储 hdfs将所有的文件全部抽象成为block块来进行存储,不管文件大小,全部一视同仁都是以block块的统一大小和形式进行存储

AssembleNet笔记

自古美人都是妖i 提交于 2020-02-04 00:19:17
https://arxiv.org/pdf/1905.13209.pdf 复杂版的slowfast 与之前的视频分类搜索网络evanet最大的区别在于,之前的evanet的meta-architecture框架固定,而且是单流的,搜索的是每个block中的层的组合;而assemblenet为多流的,block里的层的组合相对固定,主要搜索的是meta-architecture中每层的各个block的连接带来的提升; connection learning guided evolution 每个block的输入是多流的(多个subnetwork),包括不同的类型(比如说RGB,光流),不同的时间间隔;每个block多流中的各个module之间的表征连接(连接学习,connectivity learning, concurrent or sequential);block同时也可以被合并分离来测试对应效果; this is done by utilizing the learned connection weights to guide evolution, in addition to randomly combining, splitting, or connecting sub-network blocks 四个同等级的block层(不包含stem),每个block都是由多个2D

面试基础题

社会主义新天地 提交于 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);

Monkey and Banana(线性dp)

邮差的信 提交于 2020-01-28 21:20:19
Monkey and Banana AC_Code: 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 typedef long long ll; 7 const int maxn = 222; 8 9 int n,ans[maxn]; 10 struct node{ 11 int len,wide,high; 12 }block[maxn]; 13 14 bool cmp(node a, node b){//长从小到大排,长相同时,款从小到大排 15 if(a.len==b.len){ 16 return a.wide<b.wide; 17 } 18 else return a.len<b.len; 19 } 20 21 int main() 22 { 23 int t=0; 24 while( scanf("%d",&n)&&n ){ 25 int a,b,c,k=0; 26 27 while( n-- ){ 28 scanf("%d %d %d",&a,&b,&c);//每种都最多有6中摆放方式 29 block[k].len=a; block[k].wide=b; block[k++].high=c;

OC-Block的本质

给你一囗甜甜゛ 提交于 2020-01-28 05:19:15
1.block的本质 block其实就是封装了函数调用以及环境变量调用的对象。 2.block的定义 return_type (^blockName)(parameters) 3.block的本质结构 新建工程,在main.m中添加如下的代码: int age = 10; void (^blockame)(void) = ^{ NSLog(@"logBlock = %d", age); }; blockame(); 用命令行将main.m转成c++的语言,如下: xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m 生成的main.cpp打开,查看如下: 从上图可以看出,c++把block转成了__main_block_impl_0 这种结构体。 C++命名block是有格式的,格式如下:__XXX类名_block定义所在的方法名_block_impl_0 ,与block相关的结构体命名大致都类似 。 __main_block_impl_0 结构体定义如下: 其中, __main_block_impl_0 这个结构体有三个属性:__block_impl结构体类型的 impl、__main_block_desc_0结构类型的desc,还有外部获取到的变量 age。从定义中可知:把fp赋值给了impl的FuncPtr

Objective-C—— Block

南笙酒味 提交于 2020-01-28 00:33:06
OC Block 其实功能就类似C语言的函数指针,js中的闭包之类的。把代码块当做一个变量就行操作,有自己的变量和作用域。 简单看一下Block的语法和可能出现的问题: Block语法: block语法相对宽松,很多部分都可以省略,常规上我们实现一个block需要有以下几个部分 ^ 返回值类型 参数列表 表达式 例如 ^int (int count){return count+1;};//返回值为int 参数为int 表达式为 count+1; ^void (void){NSLog(@"void");}; //返回值为void 参数void 表达式为 NSLog(@"void"); 可以看到语法相对简单,而且返回值类型可以省略那么以上两个block就变 ^(int count){return count+1;}; ^(void){NSLog(@"void");}; 如果不适用参数,那么返回值列表也可以省略 ^(int count){return count+1;}; ^{NSLog(@"void");}; Block类型变量 Blcok类型的变量可以接受对应的Block,上例中两个Block就需要以下两种Block类型变量接收 int (^intBlock)(int) = ^(int count){return count+1;}; void (^voidBlock)(void)

block里的self、weakSelf、strongSelf

蓝咒 提交于 2020-01-26 18:58:16
ARC下,关于block里面使用self、weakSelf、strongSelf,理解一直没有特别的透彻,今天花时间研究了一下,总结如下: 其实一共就涉及到两个问题: 1.是否循环引用了 2.block里面的代码,不一定执行到哪行时,VC可能就释放了,self就为nil了,那么你到底想让代码在这种情况下如何执行。 其实到底用self、weakSelf还是strongSelf,就是上面两个问题的排列组合 有种典型的写法: dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); __weak __typeof__(self) weakSelf = self; dispatch_async(queue, ^{ __typeof__(self) strongSelf = weakSelf; [strongSelf assitFunc1]; }); 首先我的结论是,所有情况下,这么写是不会出什么问题的(当然也好多情况下不用这么写),唯一可能出问题的地方就是要保证block里面的代码能够被执行到,否则就和循环引用一样,是不会释放VC的。什么情况会执行不到?比如queue里面已经有1万个任务,然后正在串行执行,当然这里说的是理论上,所以一般也不会有这种情况。 不会出问题的原因是