android app 閃退原因多是 exception,大部份是 NullPointerException。
我不是說 android 有 GC 所以 bug 會比 swift iOS 少,閃退會比較少。我只是說 iOS crash 的原因很多是 dangling pointer,是因為要手動管理記憶體造成的。
這個現象對 server 是不利的。Java 是很多 NPE,但在 server 環境下就只是個 bug 而已,process 還是可以繼續服務。swift 踩到記憶體就是整個 crash,這不利 long running application 啊。(mobile 上到是無所謂)
ARC 也許可以再進化,解決這個問題吧 (例如它找到一個演算法完全解決 circular reference),不然只要讓開發者去寫 unowned 這種東西,就是有機會踩記憶體 crash。(有誰的 app 沒 unowned ??)
memory leak 和 process crash 怎麼相提並論。有 GC 又不代表不會有 memory leak,這前提還要討論嗎?
問題是沒 GC 你除了處理 memory leak ,還要擔心不小心踩到記憶體,踩到記憶體的懲罰又很嚴重 (尤其不適合要跑好幾個月的 process)
ARC 的確可有效減少踩錯,但跟完全不會踩錯的 GC 比又差了一截,這是很明顯的缺點啊。
swift ... 這種沒有 GC 的語言,適合跑 server application 嗎?
server 的程式通常都要跑個幾個月,有一點點 memory leak 就會逐漸累積,跟 desktop/mobile app 的使用行為差很多啊。mobile 上就算有點 leak,用戶也是常重開 app,沒什麼差。
除了那種很專精功能的 server 程式,通常寫應用程式型的 server ,需求和功能都很雜亂 (尤其是開發了一兩年後… ) 這種情形下還要開發者自行管理記憶體真是太痛苦。
還有,踩到 dangling pointer 怎麼辦?整個 swift process crash 嗎?一旦 crash 了,process 裡的 state 就通通消失了… (反觀 Java 的 NullPointerException,死也是死個 request 而已)
那這樣不就要兩套方法來管理了,而且,framework manager 又在哪裡?又回到 cocoapods?
swift 很需要 binary distribution 是因為 iOS 的關係。iOS library 只能用 binary 形式發佈的有很多吧 (像 aws sdk,和那些 ads 相關的 sdk 都是)