0%

macOS开发和iOS有很多相关之处,也有很多不同之处,今天带你使用最优雅的APP.dmg,一款名叫AUY的自动上传图床的APP,没有服务器,不担心数据被盗,可以上传剪切板中的图片,可以拖动文件上传、智能的APP。

AUY 传送门

阅读全文 »

基于现在iOS11新生成的图片都是HEIF,该图片使用[UIImage image:name]已不在那么优雅,图片大小为1.8m大小的,读进手机内存,直接飙升了45M,这是我们不想看到的结果,一个页面有多个这样子的图的话,恐怕就是灾难了。

既然原图不能读入,那么如何可以用更少的内存和CPU来解决呢?

这就要先了解该图片的编码了。

HEIC HEIF

带有元数据的HEIF的另一种形式。HEIC文件包含一个或多个以“高效图像格式”(HEIF)保存的图像,该格式通常用于在移动设备上存储照片。它可能包含单个图像或图像序列以及描述每个图像的元数据。最常使用文件扩展名“ .heic”,但HEIC文件也可能显示为.HEIF文件

heicheif是广色域图片的格式,广色域比sRGB表示范围大25%,在广色域设备中能显示更广的色彩,sRGB 8bit/dept,广色域达到16bit/dept。广色域只是在硬件支持的情况下才能显示的。
其实就是苹果搞的一个更高效体积更小效率更高的压缩方式。

阅读全文 »

在APP中,使用 X1、X2、X3已经是司空见惯的事情了,网上出了清空不再使用的图片和类,是不是做完这些不能再进一步优化了,答案是否定的,当然可以的,今天再探究一下资源管理优化。

资源大部分是图片,说到图片必须讲一下位图和矢量图

位图

位图图像(bitmap),亦称为点阵图像或栅格图像,是由称作像素(图片元素)的单个点组成的。这些点可以进行不同的排列和染色以构成图样。当放大位图时,可以看见赖以构成整个图像的无数单个方块。扩大位图尺寸的效果是增大单个像素,从而使线条和形状显得参差不齐。

阅读全文 »

这篇文章主要讲解关于架构的一些思考,通过这篇文章你将了解到

  1. MVC
  2. MVC变种
  3. MVP
  4. MVVM
  5. 分层设计的优缺点

没有最好的架构,只有最适合业务的架构。

MVC

苹果版本的MVCModelVC和交互,VCView交互

  • 优点:ViewModel可以重复利用,可以独立使用

  • 缺点:Controller的代码过于臃肿

阅读全文 »

看完本文章你将了解到

  1. DisplayLink和timer的使用和原理
  2. 内存分配和内存管理
  3. 自动释放池原理
  4. weak指针原理和释放时机
  5. 引用计数原理

/

CADisplayLink是将任务添加到runloop中,loop每次循环便会调用targetselector,使用这个也能监测卡顿问题。首先介绍下API

1
2
3
4
5
6
7
+ (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel;
//runloop没循环一圈都会调用
- (void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSRunLoopMode)mode;
//从runloop中删除
- (void)removeFromRunLoop:(NSRunLoop *)runloop forMode:(NSRunLoopMode)mode;
//取消
- (void)invalidate;

我们在一个需要pushVC中运行来观察声明周期

阅读全文 »

只要提到了多线程就应该想到线程安全,那么怎么做才能做到在多个线程中保证安全呢?
这篇文章主要讲解线程安全。

线程安全

线程安全是什么呢?摘抄一段百度百科的一段话

线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。

为什么需要线程安全

ATM肯定用过,你要是边取钱,边存钱,会出问题吗?当你取钱的时候,正在取,结果有人汇款正好到账,本来1000块取了100剩下900,结果到账200,1000+200=1200,因为你取的时候,还没取完,汇款到账了结果数字又加上去了。你取的钱跑哪里去了,这里就需要取钱的时候不能写入数据,就是汇款需要在你取钱完成之后再汇款,不能同时进行。

阅读全文 »

RunLoop和线程的关系,以及Thread如何保活和控制生命周期,今天我们再探究下另外的一个线程GCD,揭开蒙娜丽莎的面纱。

GCD 基础知识

GCD是什么呢?我们引用百度百科的一段话。

Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并行任务。在Mac OS X 10.6雪豹中首次推出,也可在IOS 4及以上版本使用。

GCD有哪些优点

  • GCD自动管理线程
  • 开发者只需要将task加入到队列中,不用关注细节,然后将task执行完的block传入即可
  • GCD 自动管理线程,线程创建,挂起,销毁。
    阅读全文 »

使用钩子实现了对字典和数组的赋值的校验,顺便随手撸了一个简单的jsonToModel,iOS除了runtime还有一个东西的叫做runloop,各位看官老爷一定都有了解,那么今天这篇文章初识一下runloop

什么是runloop

简单来讲runloop就是一个循环,我们写的程序,一般没有循环的话,执行完就结束了,那么我们手机上的APP是如何一直运行不停止的呢?APP就是用到了runloop,保证程序一直运行不退出,在需要处理事件的时候处理事件,不处理事件的时候进行休眠,跳出循环程序就结束。用伪代码实现一个runloop其实是这样子的

阅读全文 »

关键字 super

关键字super,在调用[super init]的时候,super会转化成结构体__rw_objc_super

1
2
3
4
5
struct __rw_objc_super { 
struct objc_object *object; //消息接受者
struct objc_object *superClass; //父类
__rw_objc_super(struct objc_object *o, struct objc_object *s) : object(o), superClass(s) {}
};
阅读全文 »

arm64之后isa是使用联合体使用更少的空间存储更多的数据,以及如何自定义和使用联合体,objc_class->cache_t cache是一个是缓存最近调用class的方法,当缓存剩余空间小余1/4则进行扩容,扩容为原来的两倍,扩容之后,已存储的method_t扩容之后之后被清空。今天我们在了解runtime的消息转发机制。

基础知识

OC中的方法调用,其实都是转换为objc_msgSend函数的调用

objc_msgSend的执行流程可以分为3大阶段

  1. 消息发送
  2. 动态方法解析
  3. 消息转发

那么我们根据这三块内容进行源码解读。源码执行的顺序大概如下

阅读全文 »