自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

小马哥好棒哦

开发过程中总结的一些东西分享给大家,共同进步~

  • 博客(111)
  • 资源 (1)
  • 收藏
  • 关注

原创 主线程是如何切换runloop的探究

对RunLoop运行机制不熟悉的可以先看我的这篇文章:深入理解RunLoop我们都知道,iOS的tableView能做到滑动很平滑,一部分是依赖于runloop的mode的切换。当系统检测到有scrollerview滑动时,系统就会将当前进程的主线程切换到UITrackingRunLoopMode,直到滑动结束,又会切换到NSDefaultRunLoopMode。这个过程听起来很奇妙,那么他是怎么做到的呢,我们能不能在需要的时候也这么做呢?答案是肯定的,我们可以模拟这个过程,我的思路是这样的:由于主

2021-11-10 17:39:52 2252

原创 app耗电检测分析以及优化

耗电量不仅是衡量应用性能表现的一个重要指标,同时也是用户体验的重要组成部分。要做好⼀款APP,不仅仅是实现功能那么简单,我们需要考虑很多性能指标,让用户用的更爽。在开发过程中,要充分考虑到各项性能指标,比如定位精度,更高的精度,往往意味着更高的能耗,因此要平衡好精度和功耗,避免我们的APP过多的电量消耗。耗电量基本概念1.What Is Energy?Idle状态说明 app 处于休眠状态,几乎不使用电量。 Active状态说明 app 处于前台工作状态,用电量⽐较高,我们可以看到图中的第

2021-10-12 10:33:39 1121

原创 iOS的包瘦身实践

随着业务的快速增加,商城App的大小也在迅速增加,一度超过了300M。安装包大小的不断增加对App下载成本,推广效率产生了比较大的影响。从2018年9月份我们对商城App开始了为期二期的专项瘦身工作:一期从V7.2.0-V7.5.2版本,共计瘦身46M(设备:iPhone X,iOS12)。为了进一步减小包大小,同时为了建立长效机制,从今年5月份开始了第二期的专项优化工作,二期优化从最高的V8.1.0版本的272M到现在的V8.4.0的214.4M共计已经完成瘦身57.6M,当然二期优化还在继续推进中。瘦身

2021-10-12 10:19:34 625

原创 HTTPS的原理

概述http(HyperText Transfer Protocol,超文本传输协议)协议是互联网中位于协议栈顶层最重要的网络协议之一,它规定了如何在互联网中传输超文本(含有指向其它文本文件链接的文本),而超文本是互联网中数据传输的主要形式。https = http + secure(安全层),https是由http协议加上安全传输协议SSL/TLS组成的,用于在互联网中安全地传输数据。下面我们就一起来看这两个协议的基本原理。http篇在了解http协议如何工作之前,我们首先需要对网络协

2021-09-29 18:30:46 101

原创 Apple安全性

Apple应用打包上传AppStore以及早些时候的真机调试都需要在Apple开发者平台上进行很多操作,比如:上传certSigningRequest文件,生成cer证书,配置Identifiers、Devices,生成mobileprovision文件,安装cer证书,导出p12文件等等。你可曾考虑过Apple为什么要求开发者做这些繁琐的操作,这些文件有什么用,它们又包含了什么信息呢?接下来我会用图文形式由浅入深地介绍一下所有相关知识。通过了解该知识,初级iOS开发者可以充分理解Apple证书配置过程中发

2021-09-29 17:47:49 115

原创 app启动时间优化

1.背景之前通过用户反馈平台发现有部分用户反馈我们的App 启动时间较长,同时从崩溃数据监控发现部分用户在App启动后崩溃, 通过日志排查我们发现崩溃的原因是App启动超时被系统kill掉了,于是我们开始分析项目中导致启动时间变长的原因,并对启动时间进行优化。2.现状分析当用户按下home键的时候,iOS的App并不会马上被kill掉,还会继续存活若干时间。理想情况下,用户点击App的图标再次回来的时候,App几乎不需要做什么,就可以还原到退出前的状态,继续为用户服务。这种持续存活的情况下启动A

2021-09-29 11:34:19 262

原创 应用程序启动类的分析

当用户点击应用图标之后,应用就开始启动。应用启动完成后,就会展示一系列的视图,和用户进行各种各样的交互(如滑动、点击)。当用户退出应用后,该应用就无法和用户进行交互。这一过程就体现了一个应用的生命周期(从启动到退出)。这里只介绍应用程序的显示部分。 在介绍应用启动过程及原理之前,先来了解一些概念以及其作用。1、UIApplication UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序。每一个应用都有自己的UIApplic...

2021-09-28 10:14:21 410

原创 iOS之KVC赋值和取值的过程

Getter以下是valueForKey:方法的默认实现,给定一个key作为输入参数,在消息接收者类中操作,执行以下过程。 ① 按照get<Key>、<key>、is<Key>、_<key>顺序查找方法。 如果找到就调用取值并执行 ⑤,否则执行 ②; ② 查找countOf<Key>、objectIn<Key>AtIndex:、<key>AtIndexes:命名的方法。 如果找到第一个...

2021-09-17 09:27:07 380

原创 IOS热更新的原理

1、首先来介绍一下JSCore的原理和通信机制JSCore 是什么?大家都知道浏览器内核的模块主要是由渲染引擎和JS 引擎组成,其中 JSCore 就是一种 JS 引擎Apple 通过将 WebKit 的 JS 引擎用 OC 封装,提供了一套 JS 运行环境以及 Native 与 JS 数据类型之间的转换桥梁,常用于 OC 和 JS 代码之间的相互调用,这也意味着他可以脱离渲染单独去执行 JS。JSCore 主要包括如下这些 classes、协议、类结构:JSCore的运行模...

2021-05-10 10:49:07 2215 1

原创 ios坐标系的转换方法解析

- (CGPoint)convertPoint:(CGPoint)point toView:(nullable UIView *)view;- (CGPoint)convertPoint:(CGPoint)point fromView:(nullable UIView *)view;- (CGRect)convertRect:(CGRect)rect toView:(nullable UIView *)view;- (CGRect)convertRect:(CGRect)rect fromVie

2021-05-03 10:07:37 642

原创 Block的总结

总结block的本质就是Objective-C对象,block的调用就是函数指针的调用。block的本质是一个封装了函数调用以及函数调用环境的OC对象; block截获自动变量值的规则: 局部变量会被直接截获; 局部静态变量会被截获其指针; 全局变量并不会被截获,而是直接使用; block截获对象的规则: block位于栈上,则不会对截获的对象变量进行强引用; block从栈上复制到堆上,调用copy函数,对截获的变量进行强/弱引用; block从堆上移除,调用dispo

2021-03-18 20:31:58 141

原创 iOS的事件分发与响应者链

首先要先学习下响应者对象UIResponder,只有继承UIResponder的的类,才能处理事件。NS_CLASS_AVAILABLE_IOS(2_0) @interface UIApplication : UIResponderNS_CLASS_AVAILABLE_IOS(2_0) @interface UIView : UIResponder <NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem, UITraitEn

2021-03-15 22:05:42 229

原创 OC中数组的valueForKeyPath函数应用

- (nullable id)valueForKeyPath:(NSString *)keyPath;1. 数组求和如果一个数组是由NSNumber或者数字的字符串组成的,可以直接进行进行求和:NSArray *array = @[@13, @23, @89, @3, @4, @46, @"2"];CGFloat sum1 = [[array valueForKeyPath:@"@sum.floatValue"] floatValue];NSLog(@"%f", sum1); /..

2021-03-15 21:51:38 448

原创 iOS性能优化的几个方向

一、界面优化1、卡顿原理要了解卡顿原理,需要对帧缓冲区、垂直同步、CPU 和 GPU 几个词进行一下了解,然后综合起来,就可以得到卡顿的答案。1.1、帧缓冲区听起来很高大上,其实就是用来存放每一帧画面数据的一个 “仓库”,一个仓库只存放一帧画面的数据,iOS 一直是双缓存,就是有两个仓库,存当前帧数据的叫 “正式仓库”,存下一帧数据的叫 “预备仓库”。当正式仓库的数据被取走后,两者身份交换,原来的预备仓库转正为正式仓库,原来的正式仓库变成预备仓库。1.2、垂直同步 (VSync)

2021-03-15 21:46:03 975

原创 锚点和position的关系

1.position定义:某一个视图的layer的position表示,该视图的layer的锚点在父视图的layer中的位置,默认的数值是视图layer的中点的数值。从上面的定义的第二句来看,position表示的是在父视图中的位置!2. anchorPoint定义:锚点,就像船锚一样,起着固定的作用,有风浪时,船会围着船锚旋转;锚点也是这样的,说白了就是固定视图用的点,每当我们给视图添加一个旋转动画时,就是围绕该点进行旋转的。3. 记住一点:position 和 锚点 必须是...

2021-03-07 11:34:06 357

原创 CALayer的modellayer和presentionlayer的区别

图层树的类型layer tree 分为 model layer tree(模型图层树) 、presentation layer tree(表示图层树) 、render layer tree(渲染图层树)图层树的结构这三种图层树有什么作用呢?说到有啥作用,就不得不提Core Animation 核心动画了。因为这三个图层在核心动画中才能显示出它们的特点和用处。下面是官方文档的说明:模型图层树中的对象是应用程序与之交互的对象。此树中的对象是存储任何动画的目标值的模型对象。每当更改图层的属性..

2021-03-07 11:04:35 457

原创 iOS线程和队列的关系

线程与队列说不清道不明的关系:线程是代码执行的路径,队列则是用于保存以及管理任务的,线程负责去队列中取任务进行执行。 我的理解:多个队列的任务可以在一条线程上执行,一个队列的任务也可以在多条线程上执行。个人理解,队列可以包含线程,线程也可以包含队列。dispatch_sync:立马在当前线程执行任务,执行完再往下走,这句话就可以解释很多问题。dispatch_async:不要求立马在当前线程执行任务,可能会开启新线程,也有可能不会。一、画图解释下队列跟线程间的关系1、一个队列对应一...

2021-03-06 10:31:04 2460

原创 智能家居设备连接路由的技术AirKiss

AirKiss原理分析一、 AirKiss概述AirKiss技术是一种创新性的信息传递技术。通过该技术可以便捷的向一台 与外界没有建立任何一种实质性连接(包括有线、无线、蓝牙、NFC等)的设备传递信息(可以是环境中Wifi的ssid、密码等信息)。AirKiss 技术示意图如下图所示,智能插座与外界没有建立任何一种实质性连接, 可以称之为信息孤岛。通过 Air Kiss 技术,微信客户端 可以将环境中的 Wifi 的ssid 与密码便捷的隔空传递给智能插座,从而使得智能插座能够快速的接入 Wif...

2021-03-03 11:16:44 669 2

原创 iOS链接外部设备的几种方式

一般iOS开发者做APP开发大部分时候都是通过Http(s)请求跟后台服务器打交道,做一些信息展示和用户交互。很少涉及到去跟外部硬件设备连接的开发。随着近年来车联网和物联网的兴起,智能家居和智能硬件的逐步火热,越来越多的app被开发出来,用来跟硬件设备进行来连接,获取硬件相关信息展示或者发送指令控制硬件来提供服务。故本文就针对iOS的app如何跟外部设备进行连接通信这个问题跟大家交流一下。本文原创,欢迎转载,转载请注明出处,如有不正确的地方恳请各位看官指正。可以分为三大类:第一类是通过网络端口,

2021-03-03 11:01:41 1963

原创 关于App项目的组件化漫谈(二)

首先要规划项目的整体架构: 项目的整体架构并不是所谓的MVC还是MVVM,在我看来,这些只是代码组织的方式,严格意义上来说并不属于项目架构,项目架构需要你站在更高的维度去看事情,规划项目如何去分层;其实一个项目的架构设计与产品的设计仅仅相关,业务层的代码划分为业务层,第三方库属于通用层,我们可以根据业务层对代码的依赖层度来划分,理所当然业务层就应该在最上面,通用层的代码在最下面,如图...

2019-09-09 11:53:49 260

原创 ios组件化漫谈

近期随着项目需求越来越多,着手对项目进行业务划分,思考如何提高团队开发效率,就想到了组件化这个话题,这里来分享一下自己的梳理和思考。首先组件化的好处,我就不用多说了,直接进入主题;回到组件化的技术方案,最早上Limboy分享的一遍文章蘑菇街组件化(MGJRouter),接着Casa提出了不同的意见(CTMediator),后来Limboy在Casa的意见上做了进一步优化,最后Bang在前...

2019-08-12 15:35:24 207

转载 IOS开发之-人脸识别

1、体验分析首先思考的应该是人脸识别登录的流程。本人第一次体验到的人脸识别技术的应用当然是支付宝。支付宝开启人脸登录流程:首先是账号密码登录---->然后在app内根据提示完成信息采集---->信息采集完成后下次登录时就可以使用该功能了!然后又找到另一款带有人脸识别登录功能app应用,其开启流程:账号密码登录后 ----> 在相关功能模块调用相机,拍摄较清...

2019-03-25 14:54:51 2211

原创 针对IOS Cookies的解析

Cookie1、什么是CookieCookie是由服务器端生成,发送给User-Agent(一般是浏览器或者客户端),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站地址时就发送该Cookie给服务器。Cookie必然会通过HTTP的Respone传过来,并且Cookie在Respone中的HTTP header中。为什么需要Cookie?H...

2019-03-25 14:53:03 554

原创 YYModel解析2

主体分层YYClassInfo主要分为以下几部分:typedef NS_OPTIONS(NSUInteger, YYEncodingType)与YYEncodingType YYEncodingGetType(const char *typeEncoding);方法 @interface YYClassIvarInfo : NSObject @interface YYClassMeth...

2019-03-22 10:56:56 339

原创 YYModel的深入理解

文件结构​ 相信使用过MJExtensions的iOS开发者来说,接触YYModel并不是很陌生,因为两者在某些思路上是相似的,例如都用了category的方式来实现,Protocol中的方法都有着相似的功能,例如黑白名单、Property名称和dictionary中key中的对应关系等。YYModel的文件包括:YYModel.h YYClassInfo.h、YYClassInfo....

2019-03-09 14:44:35 1967

转载 MBProgressHUD的讲解

MBProgressHUD是一个为 APP添加 HUD窗口的第三方框架,使用起来极其简单方便,关于 MBProgressHUD的使用方法,GitHub上有详细的说明,这里就不多加介绍了,本文主要是从源码的角度分析 MBProgressHUD的具体实现。先来对 MBProgressHUD有个大体的认识,这是刚从 GitHub上拉下来的代码,如下图,MBProgressHUD 的主要文件只有两...

2018-12-25 11:04:01 6761

原创 JS与OC交互

iOS与JS交互的方法:1.拦截url(适用于UIWebView和WKWebView) 2.JavaScriptCore(只适用于UIWebView,iOS7+) 3.WKScriptMessageHandler(只适用于WKWebView,iOS8+) 4.WebViewJavascriptBridge(适用于UIWebView和WKWebView,属于第三方框架)下面以假设的需求...

2018-12-13 10:10:30 579

转载 ios 组件化方案

1.阅读本篇文章以前,假设你已经了解了组件化这个概念。最近两年移动端的组件化特别火,但移动端组件化的概念追其溯源应该来自于Server端,具体来说这种概念应该是由Java的Spring框架带来的。Spring最初是想替代笨重的EJB,在版本演进过程中又提供了诸如AOP、DI、IoC等功能,推动了Java程序员面向接口编程,而面向接口编程在面向对象的基础上将对象又抽象了一层,对外提供的服...

2018-11-03 16:06:02 638

转载 Objection源码解析

一、简介Objection是一个iOS中轻量级的对DI及IoC的实现,不知道DI及IoC的请移步至iOS组件通信方案,Objection只有Object-C版本,没有Swift版本,如果你想在Swift中使用这种容器框架,可以了解下Typhoon,二者对于DI的实现方式不同,原理也不同,本篇文章主要分析Objection。它的优点有哪些呢?支持我们进行面向接口编程,有利于项目解耦(组件...

2018-11-03 16:04:53 573

原创 IOS原生生成二维码

一、二维码的生成从iOS7开始集成了二维码的生成和读取功能 此前被广泛使用的ZBarSDK 目前不支持64位处理器,除此之外还有ZXingSDK也可以生成二维码生成二维码的步骤 导入CoreImage框架 通过滤镜CIFilter生成二维码   二维码的内容(传统的条形码只能放数字) 纯文本 名片 URL(可直接跳转网页)   二维码生成的具体代码-...

2018-10-23 15:13:26 433

原创 sourcethree,全局忽略配置文件

# Xcode## gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore &amp; Swift.gitignore## Build generatedbuild/DerivedData/## Various settings*.pbxuser!defau...

2018-08-30 15:52:19 577

原创 IOS绘制波浪图

#import &lt;UIKit/UIKit.h&gt; @interface PKWaveView : UIView@property (assign, nonatomic) CGFloat progress; @end #import "PKWaveView.h" #define kWaveFillColor [UIColor groupTableView...

2018-08-20 10:58:54 1364

原创 IOS上传下载时时进度条封装

#import &lt;UIKit/UIKit.h&gt; @interface PKProgressView : UIView@property (assign, nonatomic) CGFloat progress; @end static const CGFloat defaultThick = 3.f;static const CGFloat defaul...

2018-08-18 18:04:08 1406

原创 ios 防止button重复点击

话不多说,直接上代码#import &lt;UIKit/UIKit.h&gt;@interface UIButton (MPK)@property (nonatomic, assign) NSTimeInterval eventTimeInterval; @end #import "UIButton+MPK.h"#import &lt;objc/runtime.h&...

2018-08-09 10:35:45 444 1

转载 IOS-组件化的好处

前言为什么要组件化随着项目的不断迭代,各个模块会越来越复杂,各个模块相互依赖,而且每个模块可能会有共同的业务逻辑,导致整个项目维护起来比较麻烦。可以采用组件化,把每个业务逻辑和模块分离,单独管理,这样比较方便维护,各个开发人员只需要关心好自己的模块就好了。组件化好处分工更加明确,提高开发效率复用性更好,能迅速的组成更多的App组件化思想就好比封装控件,复杂的控件一般都会封装,组件化只不过是把每个模...

2018-06-27 11:00:48 2251

转载 iOS组件化-私有podSpecs

首先为什么需要组件化?下面我列举了一些比较常见的问题业务模块划分不清楚,各模块之间耦合度很大,难以维护例如我们公司的商城项目随着功能和时间,代码量越来越大,早期的一些代码已经不需要了,但是不敢轻易删除,不敢保证该文件是够有被使用。就算手动去查找删除,也是一件治标不治本的方法,等过一段时间还会出现这种问题所有模块代码都编写在一个项目中,测试某个模块或功能的时候,需要编译运行整个项目这一点在做自动化测...

2018-06-27 10:50:13 939

原创 sourcetree的一些常用操作

1.克隆远程仓库点击红色箭头处的向下箭头按钮,会出现如图选项,既可以在本地建立仓库,也可以从远程仓库克隆。我这里主要从我自己的GitHub仓库克隆一份代码到我本地。如下图:1.点Clone or download,出现红框链接部分,注意链接如果是https开头的最好是换成SSH协议的链接,因为Git是默认采用SSH协议的,处理速度要比HTTPS要快。2.点击复制按钮,将链接copy到下图中如果在初...

2018-04-24 11:38:19 3092

原创 SourceTree忽略xcuserdata的步骤

1、打开sourcetree2、打开偏好设置3、选择git 4、编辑文件输入:# Xcode## gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore &amp; Swift.gitignore## Build generatedbuild/DerivedData/## Va...

2018-04-24 10:49:20 1464

原创 runtime的成员变量

成员变量1、定义:Ivar: 实例变量类型,是一个指向objc_ivar结构体的指针typedef struct objc_ivar *Ivar;2、操作函数:// 获取所有成员变量class_copyIvarList// 获取成员变量名ivar_getName// 获取成员变量类型编码ivar_getTypeEncoding// 获取指定名称的成员变量class_getInsta...

2018-04-19 16:16:12 180

原创 iOS 常见的商品详情页布局

#pragma mark -Life Cycle-(void)dealloc{    [self removeObserver];}- (void)viewDidLoad {    [super viewDidLoad];    self.navigationItem.titleView = self.segmentedView;    [self initDefault];    [self i...

2018-04-18 10:45:37 5095 5

sourcetree Mac破解版

用于工程的管理,方便开发者管理自己的代码,使用该工具直接输入Git地址即可,没有多余的操作

2018-04-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除