「 iOS知識小集 」2018 · 第 19 期

知識小集發表於2018-07-02

這周公眾號釋出的以下文章:

本期知識小集的主要內容包括:

  • WWDC 2018 蘋果推薦的大圖載入方式
  • 獲取 ipa 包三種姿勢
  • git 恢復誤刪的 stash
  • 讓人懷疑人生的一段程式碼
  • Objective-C import 第三方庫標頭檔案總結

WWDC 2018 蘋果推薦的大圖載入方式

作者: halohily

在 iOS 開發中,圖片載入到記憶體中佔用的空間和它的二進位制檔案大小無關,而是基於圖片的尺寸。在 WWDC 2018 中,蘋果為我們建議了一種大家平時使用較少的大圖載入方式,它的實際佔用記憶體與理論值最為接近。下面是示例程式碼:

func downsample(imageAt imageURL: URL, to pointSize: CGSize, scale: CGFloat) -> UIImage {
	let sourceOpt = [kCGImageSourceShouldCache : false] as CFDictionary
	// 其他場景可以用createwithdata (data並未decode,所佔記憶體沒那麼大),
	let source = CGImageSourceCreateWithURL(imageURL as CFURL, sourceOpt)!

	let maxDimension = max(pointSize.width, pointSize.height) * scale
	let downsampleOpt = [kCGImageSourceCreateThumbnailFromImageAlways : true,
kCGImageSourceShouldCacheImmediately : true ,
kCGImageSourceCreateThumbnailWithTransform : true,
kCGImageSourceThumbnailMaxPixelSize : maxDimension] as CFDictionary
	let downsampleImage = CGImageSourceCreateThumbnailAtIndex(source, 0, downsampleOpt)!

	return UIImage(cgImage: downsampleImage)
}
複製程式碼

參考資料:

iOS中的圖片使用方式、記憶體對比和最佳實踐 https://juejin.im/post/5b2ddfa7e51d4553156be305

獲取 ipa 包三種姿勢

作者: Lefe_x

以前獲取一個應用的 ipa 包輕而易舉,然而今天想獲取一個 ipa 包,如果沒有適當的方法,非常費勁。今天我們就聊聊如何獲取 ipa 包,下面這三種方式都經過親自驗證,可能由於不同環境會出現異常,若遇到問題可以到【知識小集】gong-Zhong-Hao 留言。如果你有更好的方式,不妨分享出來。

方式一:iTunes

蘋果既然在高版本的 iTunes 取消了獲取 ipa 包的入口,那我們就想辦法降級處理。需要下載低版本的 iTunes。 http://secure-appldnld.apple.com/itunes12/091-33628-20170922-EF8F0FE4-9FEF-11E7-B113-91CF9A97A551/iTunes12.6.3.dmg。

下載完後,安裝,第一次啟動的時候按住 option 鍵,這樣才不會報錯,安裝完成後,即可下載應用的 ipa 包。下載完成後,在應用的圖示上按右鍵,show in finder 即可找到 ipa 包。

「 iOS知識小集 」2018 · 第 19 期

方式二:pp助手

電腦安裝一個 pp助手客戶端,直接下載越獄應用,下載完成後,即可在“本地應用”中找打 APP 的 ipa 包。需要強調一點,這種方式下載的應用是解密後的 ipa。

「 iOS知識小集 」2018 · 第 19 期

方式三:抓包

在 Mac 中的 iTunes 中下載應用,通過 Charles 抓包獲取到 ipa 包的下載地址,直接在瀏覽器中下載,下載地址是在 p52-buy.itunes 這個域名下。

「 iOS知識小集 」2018 · 第 19 期

git 恢復誤刪的 stash

作者: Vong_HUST

日常開發過程中,相信大家都使用 git,團隊協作使用 git-flow。也經常會遇到需求做到一半,產品或者測試反饋一個線上問題,不得不 stash 當前已經寫了一半的程式碼,然後切回到 master 檢視問題,然後又恢復回原來的 stash。但是這樣操作有時候可能會把之前 stash 的程式碼誤刪,辛辛苦苦寫的程式碼說沒就沒了。那麼問題來了,stash 能否像 commit 那樣可以隨時恢復?

答案當然是肯定的。我們知道只要有提交記錄,git 肯定能恢復。其實 stash 某種程度上也可以看做一種 commit,如果還記得當時 stash 的名稱,就更加容易恢復了。可以使用如下命令列來恢復,其中 'your stash name' 處填入 stash 操作時留的名稱

$ git fsck 2> /dev/null | awk '/commit/{print $3}' | git show --stdin --grep 'your stash name'
複製程式碼

最終可以在終端中看到一些 commit 資訊和日期,找到對應想恢復的 SHA,然後執行

$ git stash apply your-commit-sha
複製程式碼

關於第一處程式碼的解釋:


1. The funny 2> /dev/null part ignores all error messages (they are thrown to /dev/null a dark hole in every UNIX system).
2. git fsck checks your repo for orphaned commits.
3. This prints a list of information, containing the id of the commit and it’s type, for example:

       dangling commit 6108663eaaac4b7e850f6d492cf83e7b65db2c97
       dangling commit b526a825c7730075eb5938917c8b8b7a98f63cdf
       dangling commit 04479ae959fc7470d04e1743f1c7149414c366fa
       dangling blob c6609e5099056da80ea1cdf5bea302225bd6b7ed
       dangling commit 9d65fa867f23d28ce618fcb5d7988180efb67f9c
    
4. We’re after commit ids, which is the third part of each line, so we run: awk '/commit/{print $3}’ to obtain the third part of each line.
5. git show shows information about that particular commit. So if we filter and print those containing the bug number… voilà!
複製程式碼

參考

讓人懷疑人生的一段程式碼

作者: 高老師很忙

大家可以看一下下面兩段程式碼(圖1和圖2)

「 iOS知識小集 」2018 · 第 19 期

「 iOS知識小集 」2018 · 第 19 期

如果已經顯示了一張沙盒裡的圖片,這個時候對相同路徑的檔案進行修改和刪除,通常我們認為_imageView應該不受到影響,因為圖片已經完成渲染,但事實並非如此,_imageView竟然會跟著發生變化,並且變化的結果也是不可預期的,比如說刪除對應的路徑的檔案,_imageView可能全部黑屏或者一些黑屏,如果不想因為後續操作而影響_imageView的顯示,那麼就需要用NSData中轉一下(圖3)。

「 iOS知識小集 」2018 · 第 19 期

是不是感覺有點懷疑人生?在WWDC 2018 Lab中我諮詢了相關的蘋果工程師,結果是為了效能,內部會有一些同步機制。以後大家遇到這樣的問題可以參考一下。

Objective-C import 第三方庫標頭檔案總結

作者: KANGZUBIN

當我們的 iOS 工程要引用其它第三方開源庫時,一般有以下幾種方式:

(1)下載原始碼直接拖拽到工程中;

(2)使用 CocoaPods 管理,當開啟 use_frameworks! 標記時,第三方庫會被編譯成 .framework 引入工程,否則就會編譯成 .a 靜態庫;

(3)使用 Carthage 管理,第三方庫會被編譯成 .framework 然後匯入工程;

(4)直接下載作者編譯好的 .framework 匯入工程。

但當我們在程式碼中要 import 第三方庫的標頭檔案時,對於這幾種情況,寫法都不太一樣,以 AFNetworking 為例,總結如下:

  • 對於(1)拖拽原始碼,只能以 "" 引號的方式 import,
#import "AFNetworking.h"
複製程式碼
  • 對於(2)CocoaPods,如果開啟 use_frameworks!,則將編譯成 .framework 庫,只能以 <> 尖括號的方式 import,此外,對於(3)和(4)也是這樣
#import <AFNetworking/AFNetworking.h>
複製程式碼
  • 而對於 CocoaPods,如果不開啟 use_frameworks!,則將編譯成 .a 庫,此時有如下 3 種方式 import,
#import "AFNetworking.h"
// 或者
#import <AFNetworking.h>
// 或者
#import <AFNetworking/AFNetworking.h>
複製程式碼

那麼問題來了,如果我們在寫一個 SDK 或者私有的 Pods 庫,需要宿主 App 工程引用某一個第三方庫,如上所述,宿主工程有很多方式引用第三方庫,這樣我們就無法確定應該以哪種方式 import 標頭檔案,怎麼辦呢?這時候我們就可以使用 __has_include() 巨集來判斷。

__has_include() 巨集接收一個預引入的標頭檔案名稱(引號或者尖括號都可以)作為引數,如果該標頭檔案能夠被引入則返回 1,否則返回 0,使用起來如下:

#if __has_include(<AFNetworking/AFNetworking.h>)
#import <AFNetworking/AFNetworking.h>
#else
#import "AFNetworking.h"
#endif
複製程式碼

關注我們

歡迎關注我們的公眾號:iOS-Tips,也歡迎加入我們的群組討論問題:

  • 「 知識小集 · 3號群 」,可以先加微信 coldlight_hhwsy9871,請註明 iOS 入群
  • 「 知識小集 · Flutter 自習室 」人數到 240+,可以先加微信 coldlight_hh 或者 bob5201215,請註明 Flutter 入群
  • 「 知識小集 · 前端修行室 」,可以先加微信 wsy9871coldlight_hh,請註明 前端入群
  • 「 知識小集 · PWA 實驗室 」,可以先加微信 wsy9871coldlight_hh,請註明 PWA入群
  • 「 知識小集 · 小程式交流群 」,可以先加微信 kangzubin,請註明 小程式入群

另外上面技術群群規比較嚴,主要以討論技術為主,發廣告等行為都一律踢出群。某天「 知識小集 · 前端修行室 」進來個妹子,然後群就炸了,控制不住大家的情緒,所以專門開了個「 知識小集 · 吐槽吹水群 」,這個群暫時不對外開放,可以加入技術群后再拉群。

知識小集是一個團隊公眾號,主要定位在移動開發領域,分享移動開發技術,包括 iOS、Android、小程式、移動前端、React Native、weex 等。每週都會有 原創 文章分享,我們的文章都會在公眾號首發。歡迎關注檢視更多內容。

「 iOS知識小集 」2018 · 第 19 期

相關文章