Notes:
本來(lái)計(jì)劃花個(gè)1、2天就把這個(gè)整理下,結(jié)果,越來(lái)越忙
,那索性就做個(gè)長(zhǎng)遠(yuǎn)計(jì)劃吧,花個(gè)1、2個(gè)月把這個(gè)整理完,也當(dāng)成自己學(xué)習(xí)swift的一個(gè)筆記吧...
Time:
2016-04-23 ~ 2016-04-24
Location:
Shanghai
Content:
First Day:
- 《一個(gè)Swift項(xiàng)目的網(wǎng)絡(luò)變遷 -- 陳乘方》
- 《Objective-C和Swift的跨平臺(tái)開(kāi)發(fā) -- Tinyfool》
- 《逆向工程:從Objective-C到Swift -- 包涵卿》
- 《擁抱Swift3.0與未來(lái)展望 -- 圖拉鼎》
- 《Swift語(yǔ)言的設(shè)計(jì)取舍及跨語(yǔ)言調(diào)用 -- 董一凡》
- 《從數(shù)學(xué)函數(shù)角度理解函數(shù)式編程 -- 丁峰》
Second Day:
- 《Swift設(shè)計(jì)模式 -- 老鎮(zhèn)》
- 《Redux in Swift——新一代的iOS應(yīng)用架構(gòu) -- 方志剛》
- 《Asynchronous Programming in Swift,Swift異步編程 -- 劉冠杉》
- 《讀Swift源碼,理解Monad -- 唐巧》
- 《How to parse float numbers-the really hard way -- 傅若愚》
Summarize
- 說(shuō)直白點(diǎn),這次會(huì)議持續(xù)2天,11個(gè)分享內(nèi)容,看著面還是挺廣的,從設(shè)計(jì)模式到語(yǔ)言層面再到應(yīng)用和逆向,基本幾個(gè)大的方向該有的都有了,不過(guò)聽(tīng)了2天云里霧里,回頭就記得一句話(huà)"函數(shù)式編程"...
- 不過(guò)這種會(huì)議本身不能指望幾個(gè)小時(shí)內(nèi)學(xué)完人家的全部功力(唐巧大哥學(xué)了一年monad了,做了100多頁(yè)P(yáng)PT才做了這個(gè)不到一小時(shí)的分享),但是能找到幾個(gè)方向就已經(jīng)算是有收獲了,哈哈.
- Swift目前的項(xiàng)目還沒(méi)有用起來(lái),這次分享的東西很多東西,估計(jì)近期都是不太可能接觸或者使用的,所以趕緊總結(jié)下,免得過(guò)幾個(gè)月,回頭忘光了...
Detail
應(yīng)用:
《一個(gè)Swift項(xiàng)目的網(wǎng)絡(luò)變遷 -- 陳乘方》
polen:
這個(gè)就是把大象裝進(jìn)冰箱需要幾步的問(wèn)題(把OC項(xiàng)目改為Swift項(xiàng)目需要幾步):
1. 把OC的代碼照搬翻譯成Swift
2. 開(kāi)始"更Swift"地寫(xiě)代碼:使用Enum Associated Values, Generic,Protocol Extension
//Enum Associated Values 枚舉 和 關(guān)聯(lián)值
enum Trade {
case Buy(stock: String, amount: Int)
case Sell(stock: String, amount: Int)
}
let trade = Trade.Buy(stock: "APPL", amount: 500)
if case let Trade.Buy(stock, amount) = trade {
print("buy \(amount) of \(stock)")
}
Enum深入學(xué)習(xí)-> http://www.tuicool.com/articles/b2YveqQ
//Generic 泛型
//泛型函數(shù)可以適應(yīng)各種類(lèi)型,這個(gè)是泛型版本的swapTwoInts函數(shù),命名為swapTwoValues:
func swapTwoValues<T>(inout a: T, inout b: T) {
let temporaryA = a
a = b
b = temporaryA
}
Generic深入學(xué)習(xí):http://www.tuicool.com/articles/YbYz6j
//Protocol Extension
protocol ExerciseType: CustomStringConvertible {
var name: String { get }
var caloriesBurned: Double { get }
var minutes: Double { get }
}
// 結(jié)構(gòu)體遵守 ErerciseType 協(xié)議, 但是也可以有自己的屬性和方法, 這也是一種繼承和封裝
struct EllipticalTrainer: ExerciseType {
let name = "Elliptical Machine"
let caloriesBurned: Double
let minutes: Double
}
struct Treadmill: ExerciseType {
let name = "Treadmill"
let caloriesBurned: Double
let minutes: Double
let distancesInMiles: Double
}
extension Treadmill {
var description: String {
return "Treadmill(\(caloriesBurned) calories and \(distancesInMiles) miles in \(minutes) minutes)"
}
}
擴(kuò)展學(xué)習(xí):面向協(xié)議編程的WWDC視頻
Session 408: Protocol-Oriented Programming in Swift
3.回調(diào)方式改變
- success和fail合并到一個(gè)回調(diào)里面(completion)
(polen:一方面代碼看起來(lái)更舒服,另外進(jìn)行鏈?zhǔn)秸{(diào)用更加可行) - 定義了一個(gè)APIResult
- 參照Alamofire修改接口,把代碼寫(xiě)的更漂亮
enum APIResult<T> {
case Success(T)
case Failure(NSError, AnyObject?)
}
4.網(wǎng)絡(luò)model改變
- ObjectMapper代替Mantle
- Struct 類(lèi)型替換了Class類(lèi)型
- 盡可能減少optional 類(lèi)型的屬性
(polen:這個(gè)是真心實(shí)踐出的收貨)
5. 數(shù)據(jù)的處理通用組件
- 對(duì)數(shù)據(jù)處理過(guò)程的抽象
- 提供通用函數(shù)作為組件
- 組件函數(shù)的參數(shù)和返回值符合flatMap參數(shù)定義
6. 其他包括網(wǎng)絡(luò)結(jié)果的鏈?zhǔn)秸{(diào)用等等等等...
這個(gè)App叫Enjoy,很實(shí)在的講了他們一步步修改,一步步完善的經(jīng)歷,踩了很多坑,但是最終也成功走下來(lái)了,總體感覺(jué)作為首場(chǎng)演講,還算不錯(cuò),中規(guī)中矩,都是比較實(shí)用的方法或者技術(shù),相當(dāng)接地氣 ??
《Asynchronous Programming in Swift,Swift異步編程 -- 劉冠杉》
一位阿里音樂(lè)的哥們,講的時(shí)候,我在和旁邊的同學(xué)聊天,很遺憾聽(tīng)?zhēng)拙?br> 他是現(xiàn)場(chǎng)編程講解型的,技術(shù)看著不錯(cuò),但是現(xiàn)場(chǎng)效果貌似不是很好...
逆向:
《逆向工程:從Objective-C到Swift -- 包涵卿》
干貨啊,干貨
自己沒(méi)怎么玩過(guò)逆向,其實(shí)把一個(gè)APP逆向還是比較簡(jiǎn)單的,classdump執(zhí)行幾條命令,基本人家的.h文件你能都看到了
包涵卿這哥們這次將的是,直接對(duì)Swift語(yǔ)言層面的逆向,相對(duì)更深入一些,不過(guò)現(xiàn)場(chǎng)沒(méi)拍照,沒(méi)記錄,除了記得幾個(gè)寄存器,大部分又忘掉了
可能很多人iOS寫(xiě)多了,底層的東西就慢慢忘記了(包括我)
我這里自己簡(jiǎn)單總結(jié)下,
如何快速當(dāng)個(gè)iOS hacker:
1.學(xué)習(xí)下xcrun命令
打開(kāi)終端,輸入xcrun clang -v
xcrun clang -v

如果出現(xiàn)截圖這個(gè)東西
okey,說(shuō)明你已經(jīng)會(huì)了xcrun了,嗯,我們繼續(xù)
(補(bǔ)充: 如果有人真要問(wèn)這個(gè)是干嘛,那我告訴你就是xcode run的意思,就是代替了xcode,以后你可以直接用這個(gè)命令打包,編譯...)
2.編譯代碼
用vim也好,自己寫(xiě)也好,先新建一個(gè)helloword.c
#include <stdio.h>
int main(int argc,char *argv[]){
printf("birdies");
return 1;
}
然后使用我們的xcrun命令,編譯我們的helloword
xcrun clang helloword.c

3. 學(xué)習(xí)匯編
接著上一步,執(zhí)行如下命令生成匯編代碼
xcrun clang -S -o - helloword.c | open -f
//以點(diǎn) .開(kāi)頭的行。這些就是匯編指令。其它的則是實(shí)際的 x86_64 匯編代碼
.section __TEXT,__text,regular,pure_instructions
.macosx_version_min 10, 11
.globl _main
.align 4, 0x90
_main: ## @main
.cfi_startproc
## BB#0:
pushq %rbp
Ltmp0:
.cfi_def_cfa_offset 16
Ltmp1:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp2:
.cfi_def_cfa_register %rbp
subq $32, %rsp
leaq L_.str(%rip), %rax
movl $0, -4(%rbp)
movl %edi, -8(%rbp)
movq %rsi, -16(%rbp)
movq %rax, %rdi
movb $0, %al
callq _printf
movl $1, %ecx
movl %eax, -20(%rbp) ## 4-byte Spill
movl %ecx, %eax
addq $32, %rsp
popq %rbp
retq
.cfi_endproc
.section __TEXT,__cstring,cstring_literals
L_.str: ## @.str
.asciz "birdies"
.subsections_via_symbols
來(lái),我們來(lái)分析一下這一段代碼:
/* 以下內(nèi)容是本文最干貨的地方 **/
//以點(diǎn) .開(kāi)頭的行。這些就是匯編指令。其它的則是實(shí)際的 x86_64 匯編代碼
.section __TEXT,__text,regular,pure_instructions
.macosx_version_min 10, 11
.globl _main //globl說(shuō)明main是個(gè)外部符號(hào)
.align 4, 0x90//對(duì)齊方式
//以上是指令,不是匯編代碼,.section 說(shuō)明接下來(lái)要執(zhí)行哪一段
_main: ## @main
.cfi_startproc //與cfi_endproc相對(duì)應(yīng),標(biāo)出main函數(shù)開(kāi)始和結(jié)束的地方
## BB#0:
//rbp是個(gè)寄存器,ABI會(huì)先把rbp的值存到棧中,回頭用的時(shí)候再取,避免被改掉
//rbp: 基礎(chǔ)指針寄存器(base pointer register)
pushq %rbp
//下面這兩條CFI指令用于輸出一些調(diào)試用的堆棧信息,告訴編譯器一些基礎(chǔ)指針或者堆棧在哪里
Ltmp0:
.cfi_def_cfa_offset 16
Ltmp1:
.cfi_offset %rbp, -16
//rsp->rbp 把局部變量放到棧上(RSP:堆棧指針,通過(guò)這個(gè)指針存取堆棧存儲(chǔ)器數(shù)據(jù))
movq %rsp, %rbp
Ltmp2:
.cfi_def_cfa_register %rbp
//將棧指針移動(dòng)32字節(jié),移動(dòng)到函數(shù)會(huì)調(diào)用的地方
subq $32, %rsp
//printf()函數(shù)調(diào)用, rax是個(gè)累加器,leaq會(huì)將 L_.str的指針加載到 rax寄存器中。
leaq L_.str(%rip), %rax
movl $0, -4(%rbp)
movl %edi, -8(%rbp)
movq %rsi, -16(%rbp)
movq %rax, %rdi
movb $0, %al
callq _printf
movl $1, %ecx
movl %eax, -20(%rbp) ## 4-byte Spill
movl %ecx, %eax
addq $32, %rsp
popq %rbp
retq
.cfi_endproc
.section __TEXT,__cstring,cstring_literals
L_.str: ## @.str
.asciz "birdies"
.subsections_via_symbols
關(guān)于這個(gè)的詳細(xì)分析在這里
https://www.objc.io/issues/6-build-tools/mach-o-executables/
http://objccn.io/issue-6-3/
擴(kuò)展:
iOS程序main函數(shù)之前發(fā)生了什么
http://blog.sunnyxx.com/2014/08/30/objc-pre-main/
2016-04-28 00:48:20 先寫(xiě)到這,明天要發(fā)版本,后面慢慢補(bǔ)充...
語(yǔ)言層面:
《擁抱Swift3.0與未來(lái)展望 -- 圖拉鼎》
《Swift語(yǔ)言的設(shè)計(jì)取舍及跨語(yǔ)言調(diào)用 -- 董一凡》
函數(shù)式編程:
《從數(shù)學(xué)函數(shù)角度理解函數(shù)式編程 -- 丁峰》
《讀Swift源碼,理解Monad -- 唐巧》
《How to parse float numbers-the really hard way -- 傅若愚》
《Objective-C和Swift的跨平臺(tái)開(kāi)發(fā) -- Tinyfool》
《Swift設(shè)計(jì)模式 -- 老鎮(zhèn)》
《Redux in Swift——新一代的iOS應(yīng)用架構(gòu) -- 方志剛》