Mac 下使用命令行压缩和解压缩 rar 文件方法
step 1. 下载工具
https://www.rarlab.com/download.html
step 2. 解压,并进入 rar 目录
step 3. 安装 rar 和 unrar 工具
1 | #rar |
step 4. 解压,测试
1 | unrar x file.rar |
Mac 下使用命令行压缩和解压缩 rar 文件方法
https://www.rarlab.com/download.html
1 | #rar |
1 | unrar x file.rar |
在写 Objective-C 代码的时候,使用结构体的时候非常少的,但是对于 Swift 而言,结构体却是经常会用到
1 | class Person { |
类创建的对象是一种引用类型,也就是说当我们通过如下代码创建一个对象的时候
1 | class Employee { |
实际上,变量存储的是该对象的地址,如果我们通过
1 | var var2 = var1 |
将该变量赋值给另一个变量,此时内存中只有一个对象,两个变量存放着相同的内存地址
而结构体则是一种值类型,也就是变量存放的不再是地址,而是当前结构体实例的值
1 | struct Employee1 { |
如果我们通过赋值给另一个变量,其实 copy 了一份新的值给另一个变量
1 | var var2 = var1 |
堆 vs. 栈
当我们创建一个对象(reference type) 的时候,实际上是存放到了内存的堆区上面,而结构体(value type)则是存放到内存的栈区上面,除非这个 value type 类型的值是对象的一部分。
堆区和栈区都是编程中必不可可少的部分,认识堆和栈可以帮助我们了解类和结构体:
到这里有件事情很清晰了:
这是看了LLVM之父 Chris Lattner 访谈录,做的小结,只关注LLVM这块。
LLVM 起源
LLVM(Low Level Virtual Machine)
LLVM: 一个模块化和可重用的编译器和工具链技术的集合,Clang是LLVM子项目,是C,C++和Objective-C编译器,因为多模块的复用,所以提供了惊人的编译速度,比GCC快 3 倍。
LLVM 的 byteCode 和 Apple 现在的 bitCode区分
LLVM开始是开源的,将所有代码转换成二进制时就叫做 bytecode – Java 当年也是这么叫的。然而这部分问题很多,然后就有了LLVM2.0,而 2.0 采用的就是BitCode机制。
LLVM 2.0 将所有的代码以比特流(bit stream)而不是字节流(byte stream)的形式编码。
Bitcode 优势:
Bitcode 缺陷: 不能解决 32 位的APP在 64 位机器上的兼容问题。而 Chris Lattner 说这个问题其实应该依靠代码逻辑来解决。
问题:如何通过代码逻辑来解决 32 位 APP 在 64 位机器上的兼容问题。
LLVM三层结构
第一层: Clang 编译器,负责编译各种语言;
第二层:代码优化器,通过模块化操作优化代码,是Bitcode逻辑的主要部分;
第三层:代码翻译器,针对不同平台和GPU将代码翻译成机器语言。
LLDB 一个有着REPL的特性和C++、python插件的开源调试器。LLDB绑定在Xcode内部,存在于主窗口底部的控制台中。
libc++,libc++ ABI: 高性能C++标准库实现,支持C++11
compiler-rt: 为 LLVM和Clang设计的编译器扩展函数库。针对 _fixunsdfdi 和其他目标机器上没有一个核心IR对应的短原生指令序列时(Oh,my god 这是什么),提供高度调优过的底层代码生成支持。
ABI是什么?
Application Binary Interface,应用二进制接口,是APP和操作系统、其应用之间的二进制接口。
—-*参考——
Chris Lattner 访谈录(上)
Transcript of episode 205, an interview of Chris Lattner on January 17, 2017
上一篇通过 Node JS 和 NSURLSession 实现了简单的 GET 请求,这一篇实现 POST 请求
1 | var http = require('http') |
Server 地址: http://127.0.0.1:9000
POST 请求格式: username=’maple’&password=’xxxx’
1 | - (void)update { |
这里是通过 NSURLSession 实现 POST 请求,所以需要做的事情有:
requestWithURL:
;setHTTPMethod:
;setHTTPBody:
;shareSession
单例实现;dataTaskWithRequest: completionHandler:
实现网络构造;resume
启动当客户端发起请求的时候,在 Node 服务端,通过
1 | console.log(dataObjc) |
输出:
1 | { username: 'maple', password: 'xxx' } |
结束,这就是一个完整的 POST 请求过程
iOS 7.0 之后,苹果推出了新的网络 API —— NSURLSession。 NSURLSession supports the HTTP/1.1, SPDY, and HTTP/2 protocols.
从文档这句话中可以看出,新的网络库支持 HTTP 1.0 和 2.0 以及 Google 的 SPDY 网络协议。从这些特性上来讲,目前开发的 APP 都应该将网络库替换成 NSURLSession 了。首先探索下该网络库的使用。
网络请求就是客户端发起请求,服务端做出响应。作为 iOS 开发,如果没有后台数据的支持,只能到网络上找 API 了,但是我们可以通过 Node JS 实现简单的数据返回。
1 | var http = require('http') |
上面这段代码解释为:
接口:http://127.0.0.1:9000
数据:
1 | [{ |
通过 curl
验证:
1 | # maple @ iMac in ~/Maple [8:53:14] |
OK, 目前为止服务端的数据已经有了。
1 | - (void)loadData { |
通过 NSURLSession 请求网络的步骤:
Step1:创建 NSURLSession 对象;
Step2:构造 url;
Step3:通过 NSURLSession 的实例方法 dataTaskWithURL: completionHandler: 构造网络请求,返回 NSURLSessionDataTask 对象
Step3: NSURLSessionDataTask 对象通过 resume 方法启动网络请求
这里 id obj = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
实现了 JSON 数据的序列化,obj 的类型是数组。
操作非常的简单,当然上面的请求是 GET 请求,下一篇看一下 POST 请求。
carthage iOS 第三方管理工具,本来不打算学习这个东西了,但是最近在看一些工程总是会遇到它,索性在这里记录下如何去使用 carthage 。
因为 Mac 有 brew 神器,闭着眼也知道怎么安装了 brew install carthage
1 | $ brew install carthage |
在写 Python 的过程中,因为有些时候参考的代码是 Python2 写的,所以在 3.x 的环境中就容易抛出一些异常信息,在这里进行记录
在写 socket 的程序的时候, recv() 函数返回值在 2.x 中是字符串的格式,但是在 3.x 之后是 byte 的格式,这样在 print() 函数中输出 recv() 的结果的时候就会报异常信息:
1 | TypeError: must be str, not bytes |
解决方案:
通过 byte() 函数进行转换
1 | byte = sk.recv(1024) |
NSMapTable 是 iOS 6 之后, 苹果公开出的一个集合类。NSMapTable 与 NSDictionary/NSMutableDictionary 类似,可以对比学习。
NSMapTable 具有以下特性:
NSMaptable API
NSMapTable: more than an NSDictionary for weak pointers