Maqy Blog

The best preparation for tomorrow is doing your best today.

CocoaPods笔记

官网网址 https://guides.cocoapods.org/ pod init 创建podfile pod install 安装 pod outdated 查看有更新的版本的pod pod update PODName 更新某个pod podfile引入组件的不同方式: pod 'Alamofire', :path => '~/Documents/Alamofire'...

通过Memory来了解Runtime

前言 这里简单分享下oc的对象在内存里是怎么存储的,主要通过查看内存的各个字段的值来了解runtime究竟是怎么布局的 memory命令可以查看一个地址只想的内存上所存储的值,我们可以用--help来看参数的设置 memory read obj查看obj的值,读取是按照字节读取的 x obj 是上边的间简写 x/x obj -c 8 -s 8 /x可以解决大小端展示问题,-c代表...

长连接

前段时间项目里重写了长连接,自己就学习了一番,并根据大佬的教学来做个小分享吧 背景 传统的APP开发中通常都是通过HTTPS请求来进行和服务端的通信的,但是对于一些复杂的业务,是需要服务端来通知客户端的,也就是全双工的通信。 其本质是通过WebSocket来建立一个长连接,然后通过长连接来进行全双工通信,这样不仅解决了客户端轮询通信的问题,也降低了宽带。 本质 长连接的本质呢,其实...

MVC 到 Flux+MVVM

MVC 传统的MVC模式主要分为三层:Model,View,Controller Model: 数据层 View: 渲染层 Controller: 逻辑层 曾经移动端最传统的模式MVC,将数据,逻辑和Ui层粉的很清晰明确,对于一些业务不是特别复杂的情况呢,这个模式还是够用的,但对于稍微复杂的模式来说,就很头疼了。最明显的缺点就是controller层越来越臃肿,稍好的情况呢,我们会...

线程安全

我们常说线程安全,那么什么是线程安全呢? 其实线程安全主要指我们在多线程处理过程中,让结果与我们的预期一致,不导致异常case。 譬如 static NSUInteger index = 0; for (NSInteger i = 0; i < 1000; i++) { dispatch_async(queue, ^{ index++; }); }...

__autoreleasing & autoreleasePool

__autoreleasing int main() { __weak NSObject * ob = nil; __weak NSObject * tb = nil; { __autoreleasing NSObject *ooo = [NSObject new]; ob = ooo; NSObject *ttt ...

Aspects 原理

Aspects 是对AOP编程思想的一种实现,所谓AOP即面向切面编程,主要是实现一种对原有功能无侵害的一种编程方式,在iOS里只要是通过预编译和运行期代码修改来实现的一种编程方式。 其实主要用的就是runtime的那一套东西,动态创建类,增加方法和方法替换等方式来在原有的功能上新增自己想要做的事情。 一般主要做的事情包括日志,性能监控,异常处理,事务处理等。 下面介绍下Aspects...

NSProxy

iOS里有一个特别神奇的存在,他就是NSProxy,一个孤单的存在,我们可以看到它的定义 @interface NSProxy <NSObject> { Class isa; } + (id)alloc; + (id)allocWithZone:(nullable NSZone *)zone NS_AUTOMATED_REFCOUNT_UNAVAILABLE; + (...

Method Forward

OC 消息流程 OC是建立在C语言基础上的一门语言,也就是在编译阶段实际上调用的是C的方法 当调用一个对象的方法的时候,例如[obj draw]实际上会转化为C方法objc_msgSend(obj, @selector(draw)),然后,方法内部会通过class找到对应的方法,然后调用具体的IMP实现。 简单的描述一下就是获取该类的方法列表,一一比对selector的name是否一致...

Runtime 基础

iOS对象创建后在内存里的结构是啥样的?图1 oc的定义结构是啥样的? struct objc_class { Class _Nonnull isa OBJC_ISA_AVAILABILITY; #if !__OBJC2__ Class _Nullable super_class OBJC2_UNAVAIL...

iOS坐标系

这里只讨论平行坐标系,不涉及z轴。 简介 iOS布局是根据坐标系来进行布局的,分为x和y轴,这里有几个重要属性需要提前介绍下。 layer的属性: anchorPoint: [CGPoint]锚点,用于表示当前点在自己的视图中的百分比位置 position:[CGPoint]用于记录锚点在父坐标系中的位置 bounds:[CGRect]记录当前视图自己的坐标系位置及大小 frame:...

VIPER 结构

什么是VIPER 简而言之是一种代码结构,与MVC 和 MVVM等结构相比,VIPER分的更加精细,易于拓展,其主要角色主要有五种: V(View): 渲染层 I(Interactor):网络请求层,数据更新等 P(Presenter): 逻辑层,组装者 E(Entry): 数据层 R(Router): 跳转层 调用关系如下: 这里这么说可能会比较抽象, 下面举个简单...

CALayerDelegate

简介 CALayerDelegate 是一个非正式协议,且所有方法都可选实现,只有当你的view需要重绘时,才会调用。 它的主要功能是:当你的view需要绘制时,提供一系列的绘制流程的控制,来让你自定义实现你的绘制。 正文 绘制相关 // 当layer被重绘时调用(如果实现了),可以设置contents optional public func display(_ layer: C...

隐式动画大明白

原理(CATransaction) CATransaction CATransaction,又称事务,这东西主要作用是:只要在该”区间”内的layer的可用来做动画的属性改变了,就会以一种过渡的形式来展现。 使用方式如下: CATransaction.begin() // 开始 CATransaction.setAnimationDuration(4) // 设置时间 self.su...

UI渲染

关于UI渲染,其实我了解的也只是个大概,所以在这里简单记一下,主要为了解惑下列问题。 1.UI渲染流程是怎么样的,从何而起,又从何而终? 2.渲染过程中需要注意些什么? 3.什么是离屏渲染? 4.怎么异步渲染? 5.怎么对渲染性能调优? 前言 其实各个平台系统都是有渲染的,而且基本都是基于OpenGL来做的渲染,而基本流程都是CPU计算,GPU渲染,其渲染流程是基本固定的,而O...

简单介绍下iOS下常用的锁操作,加上个人的理解,如有错误欢迎指出: 常用的锁分类:自旋锁,互斥锁,信号量 自旋锁 实现原理应该是全局管理一个锁标志,lock操作会占用锁,如果已经被占用,则会一直循环抢占。unlock会释放锁。 ptheard_lock_t lock; // 类型名是私自起的 // 如果>0则占用锁并做事情,否则继续抢占 lock if lock >...

项目代码重构-继承结构调整

背景:去年十月入职,针对项目中存在的问题提了一系列的重构方案,到现在大概完成了百分之三四十样子,后面会针对各个问题整理一系列的笔记。首先目前的业务线是组件开发的模式,其实主站的基础组件封装的还是不错的,但目前的业务线的代码却有些问题。 问题:例如说,我们的主要model是XXXModel,该model会在各个列表中出现,feed流,个人页,推荐流,主题信息流等,以及详情页。那么现在采取的实...

记一次列表悬浮的优化

背景:列表中有很多卡片,其中部分连续的卡片可以为一个模块,这个模块可以插在列表的任何位置,也可有任意多个模块。当滑动到该位置时,会将模块的第一个卡片悬浮在顶部,滑出去时悬浮的view会随着滑出去。 业务框架简介: viewModel:负责网络加载,数据维护。例如列表中的每个卡片要对应一个object,那么该角色会维护一个Array。 VC:列表渲染。 分析 首先要考虑的是该需求可以...

随笔-图片转码

最近用到上传图片,遇到了一些问题,所以特地记了一下: 主要是在iOS11上,有了一个新的图片格式public.heic和public.heif.那么这时候后端还没有支持这个格式的图片,所以上传后会报错。 当时的解决方案就是本地转成jpeg格式来上传。那么这时候就用到了图片格式的转码,现在来介绍一下。 假如现在的heic格式的图片原图大小在3.3M左右,如果通过PHAsset相册读取的话,有...

移动端网络知识概览

基础网络分层 应用层:http,dns,fdp等协议所在的分层 传输层:tcp,udp等协议 网络层:ip协议 数据链路层&物理层:网关,链路等 HTTP HTTP: 1.0版本每次请求都是一次链接,1.1及之后为长链接,主要通过header的collection字段实现 请求数据报文包括:方式 版本 URI header body 响应数据报文包括:状...

OC 类簇

抛个砖 iOS里类的方法都有方法签名吗? 答案是否。举个栗子 NSString *str = [[NSString alloc] initWithBytes:"" length:2 encoding:(NSUTF8StringEncoding)]; SEL selector1 = @selector(initWithBytes:length:encoding:); NSLog(@"%@...

iOS block实现原理

block类 block根据所在内存区域不同,有三种类型: _NSConcreteStackBlock:分配在栈上 _NSConcreteClobalBlock:分配在数据区 _NSConcreteMallocBlock:分配在堆上 在声明block时,如果该block没有捕获外部变量,则是_NSConcreteClobalBlock类型; 捕获了外部变量则是_NSConcreteStac...

load & initialize

NSObject 的分类里有两个比较常用的runtime方法 + (void)load; + (void)initialize; 方法对比: 1.load是main前调用,initialize是main后,第一次初始调用对象方法的时候调用 2.load不参与继承体系,initialize参与继承体系,也就是说子类会覆盖父类,分类会覆盖当前类 3.对于同一个类来说,两者都只调用一...

router 设计

路由功能主要的作用是根据指定的URL跳转到对应的页面,同时也能够提供不同组件模块间的页面跳转。 其大致的实现原理是通过字典来保存URL和与其对应的VC,当有跳转需求时根据对应关系完成跳转。 路由基础实现 其原理大都是通过一个字典来保存注册表,并提供注册VC和打开VC的接口,下面就提供一个包含最基本的router功能的实例,具体如下: // .h @interface XCRoute...

transform属性详解

transform使用方法 @interface UIView : UIResponder @property(nonatomic) CGAffineTransform transform;   // default is CGAffineTransformIdentity. animatable @end 说明:transform属性主要用于形变,位移和旋转,可用于动画展示,主要方法有...