ios block使用

iOS之Block详解

北慕城南 提交于 2019-12-10 05:48:28
iOS Block实例 : https://my.oschina.net/Jacedy/blog/842167 一、Block定义 闭包是一个函数(或指向函数的指针),再加上该函数执行的外部的上下文变量(有时候也称作自由变量)。 block 实际上就是 Objective-C 语言对于闭包的实现。 二、Block原理 // main.m int main(int argc, const char * argv[]) { @autoreleasepool { // static int age = 20; __block int age = 20; void (^blcok)(void) = ^ { age = 21; NSLog(@"%d", age); }; age = 22; NSLog(@"%d", age); blcok(); NSLog(@"%@", blcok); } } 将上述代码使用命令:$ clang -rewrite-objc main.m 编译后,截取C++代码如下: ....... __attribute__((visibility("default"))) __attribute__((availability(macosx,introduced=10_8))) #ifndef _REWRITER_typedef_NSXPCListenerEndpoint

iOS之轻松上手block

和自甴很熟 提交于 2019-12-05 04:53:36
导语 不会使用block的iOS程序员,不是一个合格的程序员 学会了block,你再也不想用繁琐的代理 block没有你想象中的那么难,不要害怕,不要畏惧,勇敢尝试 笔者入行iOS时已经是ARC的天下,所以这里只说ARC环境下的使用 什么是block block其实就是一个代码块,把你想要执行的代码封装在这个代码块里,等到需要的时候再去调用。那block是OC对象吗?答案是肯定的 来自官方文档 笔者以英语3.9级的水平给大家翻译下,“block是一个OC对象,这意味着它能被添加到集合,比如NSArray、NSDictionary” block的定义 block属性或变量 格式:返回值类型(^block名称)(参数列表) / 定义属性,block属性可以用strong修饰,也可以用copy修饰 有小伙伴留言说苹果官方建议用copy,笔者查了下文档, 确实是这样的,不过笔者未测试出copy与strong的区别,大家喜欢啥就用啥吧 / @property (nonatomic, strong) void(^myBlock)();//无参无返回值 @property (nonatomic, strong) void(^myBlock1)(NSString *);//带参数 @property (nonatomic, strong) NSString *(^myBlock2)

iOS深入学习(再谈block)

☆樱花仙子☆ 提交于 2019-12-05 04:28:39
之前写过一篇 博客 ,把Block跟delegate类比,说明了使用block,可以通过更少的代码实现代理的功能。那篇博客将block定义为类的property。 过了这么长时间,对于block的内容有了很多的遗忘,果然block的语法比较操蛋,容易遗忘,还是看看 http://fuckingblocksyntax.com/ ,复习一下操蛋的block语法,我翻译如下, (1)block作为本地变量(local variable) returnType (^blockName)(parameterTypes) = ^returnType(parameters){... }; (2)block作为类的成员属性(@property) @property (nonatomic, copy) returnType (^blockName)(parameters); 这时候可以类比delegate,实现代理功能。 (3)block作为函数参数(method parameter) - (void)someMethodThatTakesABlock:(returnType (^)(parameterTypes))blockName; 调用包括block参数的函数, [someObject somethodThatTakesABlock:^returnType(parameters){...}];

AFNetworking到底长啥样(下)

坚强是说给别人听的谎言 提交于 2019-12-04 18:05:07
在 AFNetworking到底长啥样(上) 中简单介绍了AFN涉及的主要类及其结构,接下来以一个简单的POST请求探寻其内部是如何实现的。 一、环境搭建 服务器配置 本例中直接使用iMac自带的Apache,并为其开启PHP支持。在服务器目录下编写index.php文件如下: <?php echo @"This is Layne's Response"; ?> 编写测试App 创建一个测试App,在主界面上增加一个按钮,在按钮的点击函数中发起网络请求,如下: - (AFHTTPSessionManager *)manager{//lazy if(!_manager){ _manager = [AFHTTPSessionManager manager]; } return _manager; } - (void)click{ [self.manager POST:@"http://www.layne.com" parameters:@{@"name":@"layne",@"age":@30} headers:@{@"TestName":@"myTest"} progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { NSLog(@"success:%@"

iOS multiple threads(2)------GCD

倖福魔咒の 提交于 2019-12-03 15:03:27
前面一二也说过, iOS中多线程编程工具主要有: NSThread NSOperation GCD 这三种方法都简单易用,各有千秋. 同NSThread相比,GCD的运行效率更高,开发更简单。 但GCD确是诱惑力的,因为其本身是apple为多核的并行运算提出的解决方案.虽然当前移动平台用双核的不多,但不影响GCD作为多线程编程的利器(新一代的apple设备已经是双核了 ) 概述 iOS中,concurrency编程的框架就是GCD(Grand Central Dispatch), GCD的使用非常简单。它把任务分派到不同的queue队列来处理。开发者把任务代码装到一个个block里面,操作系统把这些任务代码分派到不同的资源 里去处理,一个简单的例子来说,为什么初学者写tableview的时候,滑动列表时总会很卡,因为很多初学者把图片装载放到main thread主线程去执行,例如我们要滑动畅顺的话,iOS最快可以1秒内刷新60次,如何你的一个cell的文字和图片装载超过1/60秒的话,自然就 会卡。所以一般我们会把图片装载这些需要多点时间的移出main thread来处理,对于用GCD来说,就是把图片载入放到另外一个queue队列中来异步执行,当资源准备好了后,放回到main thread中显示出来。main thread在GCD中就是main queue。

iOS经典面试题

做~自己de王妃 提交于 2019-12-03 04:50:46
iOS经典面试题 前言 写这篇文章的目的是因为前两天同学想应聘iOS开发,从网上找了iOS 面试题 和答案让我帮忙看看。我扫了一眼,倒吸了一口冷气,仔细一看,气的发抖。整篇题目30多个没有一个答案是对的,总结这篇面试题的作者对iOS机制根本就是一知半解就敢发到网上,不管有心还是无心都是坑害新人。所以在这里总结一下这几年面试别人和被别人面试遇到的一些我认为比较好的基础题目分享给大家,进阶题目在后续补充。我的理解如果有错漏请一定指出,非常感谢! 从12年开始做面试官到现在已经三个年头了,这期面过很多形形色色的开发,有腾讯的、有百度的、有小公司的、有做外包的,还有完全没有代码能力来做管理的。给我的感觉是百度出品的技术能力最好,基础知识、技术细节掌握的非常的扎实并且自信。腾讯出品技术细节上也非常厉害,平均来说比百度差一些,但是解决问题的能力非常强,思维很活跃大局观好。小公司、外包公司的同学技术细节、基础知识要差一些。我个人是非常反对以出身论英雄BAT出品就一定比其他公司的优秀,只能说BAT提供的技术氛围更好,你可以跟更多优秀的人共事,相比小公司技术进步更容易些。 这期间我也面了很多互联网公司,腾讯、百度、阿里、快播还有其他很多中小型公司,给我的感觉是中国整体的互联网面试官的态度非常糟糕,面试官经常性习惯性的迟到,理由有开会啦、在吃饭啦,最离谱的是没有任何理由就让你在那里等

iOS面试题总结

放肆的年华 提交于 2019-12-02 06:14:09
什么是Block? Block是将函数及其执行上下文封装起来的对象。 什么是Block调用? Block调用实质上就是函数调用。 截获变量 对基本数据类型的局部变量截获其值。 对象类型的局部变量连同所有权修饰符一起截获。 局部静态变量以指针形式截获。 全局变量、静态全局变量不截获。 __block修饰符 一般情况下,对被截获变量进行赋值操作需要添加__block修饰符。 需要__block:局部变量:基本数据类型、对象类型 不需要__block:静态局部变量、全局变量、静态局部变量。 赋值 不等于 使用! __block 修饰的变量变成了对象。 __forwarding存在的意义: 不论在任何内存位置,都可以顺利的访问同一个__block变量。 为什么block会产生的循环引用? 当前block对当前对象的某一成员变量截获的话,block会对这一变量有一个强引用,而当前对象又对其当前block有强引用,就产生了一个自循环引用。可以通过__weak对该成员变量进行修饰来消除循环引用。 使用__block来修饰,在MRC下不会循环引用,在ARC下会循环引用,在ARC下要通过断环的方式解除循环引用,但是有个弊端,如果block一直没有调用,这个循环引用是没有办法解除的。 runtime 数据结构 objc_object objc_class isa指针:对象指向类对象,类对象指向元类对象

MGJRouter源码解析及使用方法

╄→гoц情女王★ 提交于 2019-12-01 09:48:12
MGJRouter源码解析 MGJRouter是实现iOS组件间交互的工具之一,路由的使用降低了不同模块之间的耦合度,提高代码的复用率以及不同模块间重组的灵活度,下面我就针对MGJRouter说一下自己的理解: 注册 routes主要用于存储已经注册过的路径及block @property (nonatomic) NSMutableDictionary *routes; 下面三个方法是注册时对URL进行递归遍历以及对block进行存储 - (void)addURLPattern:(NSString *)URLPattern andHandler:(MGJRouterHandler)handler { //解析当前 URL 并转化出字典存贮在self.routes中 NSMutableDictionary *subRoutes = [self addURLPattern:URLPattern]; //将block存入到字典中 if (handler && subRoutes) { subRoutes[@"_"] = [handler copy]; } } - (void)addURLPattern:(NSString *)URLPattern andObjectHandler:(MGJRouterObjectHandler)handler { NSMutableDictionary

iOS开发:Blocks探究——基本用法

▼魔方 西西 提交于 2019-11-29 14:20:35
文章目录 Block是什么 Block的语法 Block的语法格式 Block类型的声明与赋值的使用 Block与一般的C语言变量相似的使用 Block在OC中的使用 作为 typedef 声明类型 Block截取变量 Blocks 变量的循环引用以及如何避免 ARC 下,通过 __weak 修饰符来消除循环引用 MRC 下,通过 __block 修饰符来消除循环引用 Block是什么 Block是带有自动变量的匿名函数。如字面意思,Block没有函数名,另外Block带有插入记号"^",插入记号便于查找到Block,后面跟的一个括号表示块所需要的一个参数列表。和函数一样,可以给块传递参数,并且也具有返回值。 不同点在于,块定义在函数或者方法内部,并且能够访 问在函数或方法范围 内的任何变量。通常情况下,这些变量能够访问但不能改变其值,有一个特殊的块修改器(由块前面由两个下划线字符组成)能够修改块内变量的值。 Blocks 也被称作 闭包 、 代码块 。展开来讲,Blocks 就是一个代码块,把你想要执行的代码封装在这个代码块里,等到需要的时候再去调用。 Block的语法 Block的语法格式 Block的完整语法格式如下: ^ returnType (argument list) {expressions} 与 C 语言函数的区别: 没有函数名 带有 “^” 符号

javascript与Objective-C的交互

大城市里の小女人 提交于 2019-11-28 22:31:08
在iOS开发中, 苹果api味我们提供了多种javascript和Objective-C交互的方法, 使用还是比较简单的. 1. 普通的方式实现javascript和Objective-C交互 1.1 oc原生代码调用js代码 通过webView的stringByEvaluatingJavaScriptFromString:方法调用js代码. 此方法可以无限制的执行任何的js代码. /** 原生调用js, 普通的方法: * 通过webView的stringByEvaluatingJavaScriptFromString:方法, 可以无限制的执行任意的js代码,可以通过js代码操控webView上面的任意元素, 也可以直接通过js调用webView中的js代码. 实现从原生代码到javascript的联系. * */ [self.webView stringByEvaluatingJavaScriptFromString:@"showAlert('javascript message')"]; [self.webView stringByEvaluatingJavaScriptFromString:@"document.getElementById('abshdfnb').style.backgroundColor = 'blue';"]; 1.2 通过js调用js代码