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

这周公众号发布的以下文章:

本期知识小集的主要内容包括:

  • 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 包。

方式二:pp助手

电脑安装一个 pp助手客户端,直接下载越狱应用,下载完成后,即可在“本地应用”中找打 APP 的 ipa 包。需要强调一点,这种方式下载的应用是解密后的 ipa。

方式三:抓包

在 Mac 中的 iTunes 中下载应用,通过 Charles 抓包获取到 ipa 包的下载地址,直接在浏览器中下载,下载地址是在 p52-buy.itunes 这个域名下。

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)

如果已经显示了一张沙盒里的图片,这个时候对相同路径的文件进行修改和删除,通常我们认为_imageView应该不受到影响,因为图片已经完成渲染,但事实并非如此,_imageView竟然会跟着发生变化,并且变化的结果也是不可预期的,比如说删除对应的路径的文件,_imageView可能全部黑屏或者一些黑屏,如果不想因为后续操作而影响_imageView的显示,那么就需要用NSData中转一下(图3)。

是不是感觉有点怀疑人生?在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 等。每周都会有 原创 文章分享,我们的文章都会在公众号首发。欢迎关注查看更多内容。

猜你喜欢

转载自juejin.im/post/5b396fece51d4558a3055131