Home
Ouyang Rong
Cancel

Objective-C - Runtime 总结梳理

Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发,具体怎么实现的呢。我们从下面几个方面探寻Runtime的实现机制。 Runtime介绍 Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制。而这个扩展的核心是一个用 C 和编译语言写的 Runtime 库。它是 Objective-C 面向对象和动态...

深入理解 iOS 内存管理(Memory Management)

前言 苹果在 2011 年的时候,在 WWDC 大会上提出了自动的引用计数(ARC)。ARC 背后的原理是依赖编译器的静态分析能力,通过在编译时找出合理的插入引用计数管理代码,从而彻底解放程序员。 在 ARC 刚刚出来的时候,业界对此黑科技充满了怀疑和观望,加上现有的 MRC 代码要做迁移本来也需要额外的成本,所以 ARC 并没有被很快接受。直到 2013 年左右,苹果认为 ARC 技术...

多线程详解

概述 在iOS中每个进程启动后都会建立一个主线程(UI线程),这个线程是其他线程的父线程。由于在iOS中除了主线程,其他子线程是独立于Cocoa Touch的,所以只有主线程可以更新UI界面。iOS中多线程使用并不复杂,关键是如何控制好各个线程的执行顺序、处理好资源竞争问题。 我们运用多线程的目的是:将耗时的操作放在后台执行。 进程(Process):是计算机中的程序关于某数据集...

苹果内购

内购简介 IAP 全称:In-App Purchase,是指苹果 App Store 的应用内购买,是苹果为 App 内购买虚拟商品或服务提供的一套交易系统。 适用范围 在 App 内需要付费使用的产品功能或虚拟商品/服务,如游戏道具、电子书、音乐、视频、订阅会员、App的高级功能等需要使用 IAP,而在 App 内购买实体商品(如淘宝购买手机)或者不在 App 内使用的虚拟商品(...

本地先下载PDF文件,再用WKWebView显示

需求分析 项目中要用WKWebView显示PDF链接,发现用系统自带的缓存策略在网络差的时候,加载不出来。于是,为了更好的用户体验,还是自己做一个本地存储的逻辑。这样,无论网络好坏,只要本地下载了PDF文件就可以快速从本地加载出来。同时,还有另外一个问题,当跳到下一个页面再回来的时候,WebView变白了,又要重新加载数据,这个时候如果本地存储了PDF文件的话,页面显示出来就快很多。 W...

处理上传图片太多导致内存崩溃的问题

问题分析 批量上传图片,当图片多了的时候,内存崩溃了。 Message from debugger: Terminated due to memory issue 解决方法 创建队列,用信号量,实现图片一张一张上传。 static SSTUploadHomeworkPictureManager *manager = nil; static dispatch_queue_t ...

多线程 - 重复网络请求优化

问题分析 一个页面,可以通过点击不同的模块获取相应的数据。但是,当用户频繁点击的时候,有的模块网络请求数据返回会比较慢,这个时候返回的数据就会覆盖当前模块的数据。 解决方法 加锁处理 切换模块时,会对同一个API进行多次请求,但因为调用的接口都是一样的,所以最好就是加上锁,防止重复请求造成网络资源浪费。 @synchronized (self) {//加锁,避免数组重复创建添加等...

Jekyll + Github Pages 搭建个人博客

Jekyll 简介 Jekyll 特点 Jekyll 的核心是一个文本转换引擎。它的方便之处在于支持多种文本标记语言:Markdown,Textile,HTML,然后 Jekyll 就会帮你加入你选择主题的样式的布局中。最终生成你自己的静态博客网站。 每一个程序员都有着一颗Geek的心 Jekyll 架构 一个基本的 Jekyll 网站的目录结构一般是像这样的: . ├── _c...

图片转PDF

获取tableView截取的多张图片 -(NSArray *)imagesArrForTableView{ //0.更新historyTableView的约束 选择学科的不能重复截图 [self.historyTalbelView mas_updateConstraints:^(MASConstraintMaker *make) { make.top.m...

用多线程控制程序执行顺序

一、按顺序多次从一个接口请求数据 //按顺序请求语数英三门学科的数据; - (void)getAllSubjectHomeworkData { if (self.subjectCountData.list.count == 0) { return; } dispatch_queue_t queueUploadBegin = dispatch_queu...