排序:
默认
按更新时间
按访问量

iOS — block捕获自动变量的值

int val = 10; void (^blk)(void) = ^{printf("val=%d\n",val);}; val = 2; blk(); 上面这段代码输出值是:val = 10,而不是2,block截获自动变量的瞬时值。因为block保存了...

2018-10-15 17:23:08

阅读数:13

评论数:0

iOS 一个HTTPS连接的客户端与服务端交互过程

在一个HTTPS连接的网络中,输入账号和密码病单击登陆按钮后,到服务器返回这个请求前,这期间经历了什么? 答:具体经历了一下8步: 客户端打包请求。其中包括URL、端口、账号和密码等。使用账号和密码登陆应该用的是POST方式,所以相关的用户信息会被加载到body中。这个请求应该包含3个方面:网...

2018-09-26 21:43:32

阅读数:45

评论数:0

Swift 4.0 Codable 序列化

如果要将一个对象持久化,需要把这个对象序列化。过去的做法是实现NSCoding协议,但实现NSCoding协议的代码写起来很繁琐,尤其是当属性非常多的时候。 Swift 4中引入了Codable协议,可以大大减轻了我们的工作量。我们只需要让需要序列化的对象符合Codable协议即可,不用再写任何...

2018-09-21 14:39:35

阅读数:43

评论数:0

iOS 对象的归档和反归档(序列化)

在iOS中,对象的序列化和反序列化分别使用NSKeyedArchiver和NSKeyedUnarchiver两个类,我们可以把一个类对象进行序列化然后保存到文件中,使用时再读取文件,把内容反序列化出来。这个过程通常也被称为对象的编码(归档)和解码(解档)。 需要注意的是,NSKeyedArchi...

2018-09-19 11:10:17

阅读数:27

评论数:0

OC的自省

自省在OC中就是:判断一个对象是否属于某个类的操作。它有一下两种形式: [obj iskindOfClass:[SomeClass class]]; [obj isMemberOfClass:[SomeClass class]]; 在上面的代码中,第一行代码中的isKinOffClass...

2018-09-16 21:07:32

阅读数:23

评论数:0

Swift —— protocol的动态特性

protocolChef { func makeFood() } extension Chef { func makeFood() { print("Make Food") } } struct SeafoodC...

2018-09-16 20:58:07

阅读数:15

评论数:0

Swift — struct与class的差异

内存分配 内存分配分为栈内存分配和堆内存分配两种 栈内存的存储结构比较简单,你可以简单的理解为push到栈底pop出来这么简单,而要做的就是通过移动栈针来分配和销毁内存 堆内存相比栈有着更为复杂的存储结构,他的分配方式你可以理解为在堆中寻找合适大小的空闲内存块来分配内存,把内存块重新插入堆来...

2018-09-10 14:22:14

阅读数:36

评论数:0

Swift — 数据源中的同构和异构

对于Swift的集合数据来说,有同构和异构之分。如果你需要讨论一群鸟类或者一批飞机,那么这样的数据是同构的,比如包含鸟类的数组[Bird]和包含飞机的数组[Airplane]。有时你想要探讨的是这些空中家伙们的共性:飞翔,因此你的数据源可能同时包含Bird和Airplane,这样的是剧院叫做异构数...

2018-09-06 23:14:33

阅读数:20

评论数:0

Swift — 关键字try、try?、try! 和defer

try:和可选类型相似,编译器强制我们在使用可能跑出错误的房时使用try关键字。 try?:有点类似于可选型中的可选链,如果方法正确,则完整执行;如果跑出错误,则方法提前结束,但不会抛出错误进行处理。 try!:类似于可选型中的强制解包,同样不会对错误进行处理,但是一旦方法抛出错误,就会造成程...

2018-09-06 22:45:16

阅读数:9

评论数:0

iOS DZNEmptyDataSet源码解析

DZNEmptyDataSet是一个无数据时的空白页展示框架,支持自定义文字和图片,用起来很方便。最近研究了一下它的源代码,学习到了很多编程上的技巧。 基本用法以UITableView为例,UITableView只需要遵循DZNEmptyDataSet的代理方法,代理方法设置空白页显示文字和图片...

2018-08-27 11:52:32

阅读数:66

评论数:0

iOS Swizzle的正确使用方式(原文翻译)

文章翻译自https://blog.newrelic.com/engineering/right-way-to-swizzle/    感谢作者Bryce Buchanan 通常在运行时,Swizzle是通过用一个方法的实现来替换另一个方法的实现来运作的。运用Swizzle可能是因为不同的需求...

2018-08-25 16:41:24

阅读数:59

评论数:0

iOS objectForKey与valueForKey的区别

objectForKey: returns the value associated with aKey, or nil if no value is associated with aKey. 返回指定 key 的 value,若没有这个 key 返回 nil. valueForKey: re...

2018-08-22 14:44:54

阅读数:50

评论数:0

iOS _cmd的意义

在Apple的官方介绍里看到轻描淡写的说了一句:“The _cmd variable is a hidden argument passed to every method that is the current selector”,其实说的就是_cmd在Objective-C的方法中表示当前方法...

2018-08-21 11:34:51

阅读数:37

评论数:0

Swift 中如何理解copy-on-write

当值类型(如struct)在复制时,复制的对象和元、原对象实际上在内存中指向同一个对象。当且仅当修改复制后的对象时,才会在内存中重新创建一个新的对象。举例: //arrayA是一个数组,为值类型 let arrayA = [1,2,3] //arrayB这个时候与arrayA在内存中是同一个...

2018-08-09 23:12:18

阅读数:82

评论数:0

iOS--assign修饰对象类型会怎样?

首先我们需要明确,对象的内存一般被分配到堆上,基本数据类型和oc数据类型一本被分配在栈上。 如果用assign修饰对象,当对象释放后(因为不存在强引用,离开作用域对象内存可能被回收),指针的地址还是存在的,也就是说指针并没有被置为nil,下次再访问该对象就会造成野指针异常。对象是分配在堆上的,堆...

2018-08-09 22:50:27

阅读数:231

评论数:0

MacBookPro 连接无线显示“密码无效”

当你确定输入的密码是正确的,却提示你密码无效,试了几次都不行的时候,把电脑上的USB端口上的设备都拔掉试试,USB3.0设备会影响wifi连接。

2018-07-27 10:16:17

阅读数:4117

评论数:4

iOS AFN网络请求报错: Invalid parameter not satisfying: URLString

string = [string stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\&q...

2018-07-26 17:27:21

阅读数:38

评论数:0

CocoaPods安装报错:gem install cocoapods ERROR: While executing gem ... (Gem::FilePermissionError)

在cocoapods 执行 sudo gem install cocoapods的时候出现  While executing gem ... (Gem::FilePermissionError)    You don't have write permissions for the /usr/bi...

2018-06-26 23:24:29

阅读数:88

评论数:0

iOS assign与weak的区别

相同点:两者都是弱引用声明类型;不同点:weak声明的变量在栈中就会自动清空,赋值为nil;  assign声明的变量在栈中可能不会自动赋值为nil,就会造成野指针错误注意: 在MRC下,使用delegate时使用assign,ARC时用assign需要手动释放,建议用weak更安全。不管是MRC...

2018-06-20 14:40:16

阅读数:34

评论数:0

GCD dispatch_sync同步引起死锁的问题

截图中可以看到程序运行到主线程同步执行时出现崩溃,下面来分析一下崩溃原因:首先了解一下dispatch_sync:第一个参数 queue 为队列对象,第二个参数block为block对象。这个接口是同步将block扔到队列queue中去执行,即扔了我就等着,等到queue排队把这个block执行完...

2018-06-14 18:18:54

阅读数:35

评论数:0

提示
确定要删除当前文章?
取消 删除
关闭
关闭