用于处理多任务的主流 iOS 框架:
- 运行循环(run loop)
- 线程(Thread)
- 操作(operation)
- GCD(Grand Central Dispatch)
栈帧的追溯需要用到函数:
int backtrace(void**,int);
char** backtrace_symbols(void* const*,int);
用法和 linux 上一样,参考链接:这里
遇到的疑难点:
Q1:统计上报相比 8.2.0 版本, 8.3.0 版本的本地歌曲播放 204(ffmpeg 预解码出错) 错误升高!
S:既然是解码出错,就先确认播放源有没有问题,根据上报的歌曲 hash 从曲库中拿到歌曲,再放到播放器里播放,确认了曲库歌曲没有问题;接下来就考虑是否是网络波动导致下载完后歌曲损坏了,这时候就得联系用户了,跟用户确认后该用户并没有下载这些歌曲,可以确认那就是播放的是已经缓存过的歌曲,拿到用户的整个 Document 文件夹后分析了这些缓存歌曲文件,发现这些缓存歌曲是经过加密的。这时候问题就清楚了,用户 8.2.0 版本在线试听了这些歌曲后缓存到了本地,这些缓存都是经过加密的;升级到 8.3.0 后,缓存歌曲是不经过加密的,然后在播放 8.2.0 那些经过加密的缓存歌曲时 ffmpeg 就报了 204 错误了。
GCD 定时器基于分派队列,而不是像 N STimer 那样基于运行循环,这意味着把它们用在多个线程应用中要容易得多。GCD 定时器用块而不是选择器,所以不需要独立的方法处理定时器,这样也更容易避免重复 GCD 定时器的循环保留。
“想必很多人都跟撩妹一样,小时候被大人教育“你要勤奋呐~你看隔壁小王,每天学到十二点半!”然而,看完这个才知道,天道并非一定酬勤,深度思考决定人生,我们要做的就是掌握深度思考的方法并不断练习。
先说个故事。
从 iosopendev 官网上下载最新的 iOSOpenDev 1.6-2 Installer安装包安装。
安装过程中可能会遇到安装失败的情况,如下:
我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strong与copy。那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢?让我们先来看个例子。
在微博上看到 @我就叫Sunny怎么了 提出了一个问题:看下面的一段代码,想一想是否会造成循环引用?
__weak typeof(self) weakSelf = self
self.foo.block = ^ {
__strong typeof(self) strongSelf = weakSelf;
NSlog(@"%@",strongSelf);
};
首先要观察到问题不在于 weak_strong 的模式,而是 block 中出现了 typeof(self), 而不是 typeof(weakSelf), 那究竟 block 会不会 capture 这个 typeof 中的 self 呢?
由于没有寻觅到比较靠谱的图床,所以准备通过上传图片到GitHub上我的hexo项目里,再使用本地路径来调用的方法感觉应该可以。稍微麻烦的是本地图片路径的写法问题。
首先,在hexo目录下的source文件夹下建立一个imgages文件夹,用来保存博客里要用到的图片。比如我上传了一张名为2.jpg的图片。