object-c
文章平均质量分 80
敬业的程序猿
~~
展开
-
主线程是如何切换runloop的探究
对RunLoop运行机制不熟悉的可以先看我的这篇文章:深入理解RunLoop我们都知道,iOS的tableView能做到滑动很平滑,一部分是依赖于runloop的mode的切换。当系统检测到有scrollerview滑动时,系统就会将当前进程的主线程切换到UITrackingRunLoopMode,直到滑动结束,又会切换到NSDefaultRunLoopMode。这个过程听起来很奇妙,那么他是怎么做到的呢,我们能不能在需要的时候也这么做呢?答案是肯定的,我们可以模拟这个过程,我的思路是这样的:由于主原创 2021-11-10 17:39:52 · 2261 阅读 · 0 评论 -
app耗电检测分析以及优化
耗电量不仅是衡量应用性能表现的一个重要指标,同时也是用户体验的重要组成部分。要做好⼀款APP,不仅仅是实现功能那么简单,我们需要考虑很多性能指标,让用户用的更爽。在开发过程中,要充分考虑到各项性能指标,比如定位精度,更高的精度,往往意味着更高的能耗,因此要平衡好精度和功耗,避免我们的APP过多的电量消耗。耗电量基本概念1.What Is Energy?Idle状态说明 app 处于休眠状态,几乎不使用电量。 Active状态说明 app 处于前台工作状态,用电量⽐较高,我们可以看到图中的第原创 2021-10-12 10:33:39 · 1187 阅读 · 0 评论 -
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 · 638 阅读 · 0 评论 -
HTTPS的原理
概述http(HyperText Transfer Protocol,超文本传输协议)协议是互联网中位于协议栈顶层最重要的网络协议之一,它规定了如何在互联网中传输超文本(含有指向其它文本文件链接的文本),而超文本是互联网中数据传输的主要形式。https = http + secure(安全层),https是由http协议加上安全传输协议SSL/TLS组成的,用于在互联网中安全地传输数据。下面我们就一起来看这两个协议的基本原理。http篇在了解http协议如何工作之前,我们首先需要对网络协原创 2021-09-29 18:30:46 · 109 阅读 · 0 评论 -
Apple安全性
Apple应用打包上传AppStore以及早些时候的真机调试都需要在Apple开发者平台上进行很多操作,比如:上传certSigningRequest文件,生成cer证书,配置Identifiers、Devices,生成mobileprovision文件,安装cer证书,导出p12文件等等。你可曾考虑过Apple为什么要求开发者做这些繁琐的操作,这些文件有什么用,它们又包含了什么信息呢?接下来我会用图文形式由浅入深地介绍一下所有相关知识。通过了解该知识,初级iOS开发者可以充分理解Apple证书配置过程中发原创 2021-09-29 17:47:49 · 121 阅读 · 0 评论 -
app启动时间优化
1.背景之前通过用户反馈平台发现有部分用户反馈我们的App 启动时间较长,同时从崩溃数据监控发现部分用户在App启动后崩溃, 通过日志排查我们发现崩溃的原因是App启动超时被系统kill掉了,于是我们开始分析项目中导致启动时间变长的原因,并对启动时间进行优化。2.现状分析当用户按下home键的时候,iOS的App并不会马上被kill掉,还会继续存活若干时间。理想情况下,用户点击App的图标再次回来的时候,App几乎不需要做什么,就可以还原到退出前的状态,继续为用户服务。这种持续存活的情况下启动A原创 2021-09-29 11:34:19 · 271 阅读 · 0 评论 -
应用程序启动类的分析
当用户点击应用图标之后,应用就开始启动。应用启动完成后,就会展示一系列的视图,和用户进行各种各样的交互(如滑动、点击)。当用户退出应用后,该应用就无法和用户进行交互。这一过程就体现了一个应用的生命周期(从启动到退出)。这里只介绍应用程序的显示部分。 在介绍应用启动过程及原理之前,先来了解一些概念以及其作用。1、UIApplication UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个应用程序。每一个应用都有自己的UIApplic...原创 2021-09-28 10:14:21 · 424 阅读 · 0 评论 -
iOS之KVC赋值和取值的过程
Getter以下是valueForKey:方法的默认实现,给定一个key作为输入参数,在消息接收者类中操作,执行以下过程。 ① 按照get<Key>、<key>、is<Key>、_<key>顺序查找方法。 如果找到就调用取值并执行 ⑤,否则执行 ②; ② 查找countOf<Key>、objectIn<Key>AtIndex:、<key>AtIndexes:命名的方法。 如果找到第一个...原创 2021-09-17 09:27:07 · 386 阅读 · 0 评论 -
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 · 2228 阅读 · 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 · 659 阅读 · 0 评论 -
Block的总结
总结block的本质就是Objective-C对象,block的调用就是函数指针的调用。block的本质是一个封装了函数调用以及函数调用环境的OC对象; block截获自动变量值的规则: 局部变量会被直接截获; 局部静态变量会被截获其指针; 全局变量并不会被截获,而是直接使用; block截获对象的规则: block位于栈上,则不会对截获的对象变量进行强引用; block从栈上复制到堆上,调用copy函数,对截获的变量进行强/弱引用; block从堆上移除,调用dispo原创 2021-03-18 20:31:58 · 143 阅读 · 0 评论 -
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 · 240 阅读 · 0 评论 -
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 · 461 阅读 · 0 评论 -
iOS性能优化的几个方向
一、界面优化1、卡顿原理要了解卡顿原理,需要对帧缓冲区、垂直同步、CPU 和 GPU 几个词进行一下了解,然后综合起来,就可以得到卡顿的答案。1.1、帧缓冲区听起来很高大上,其实就是用来存放每一帧画面数据的一个 “仓库”,一个仓库只存放一帧画面的数据,iOS 一直是双缓存,就是有两个仓库,存当前帧数据的叫 “正式仓库”,存下一帧数据的叫 “预备仓库”。当正式仓库的数据被取走后,两者身份交换,原来的预备仓库转正为正式仓库,原来的正式仓库变成预备仓库。1.2、垂直同步 (VSync)原创 2021-03-15 21:46:03 · 992 阅读 · 0 评论 -
锚点和position的关系
1.position定义:某一个视图的layer的position表示,该视图的layer的锚点在父视图的layer中的位置,默认的数值是视图layer的中点的数值。从上面的定义的第二句来看,position表示的是在父视图中的位置!2. anchorPoint定义:锚点,就像船锚一样,起着固定的作用,有风浪时,船会围着船锚旋转;锚点也是这样的,说白了就是固定视图用的点,每当我们给视图添加一个旋转动画时,就是围绕该点进行旋转的。3. 记住一点:position 和 锚点 必须是...原创 2021-03-07 11:34:06 · 370 阅读 · 0 评论 -
CALayer的modellayer和presentionlayer的区别
图层树的类型layer tree 分为 model layer tree(模型图层树) 、presentation layer tree(表示图层树) 、render layer tree(渲染图层树)图层树的结构这三种图层树有什么作用呢?说到有啥作用,就不得不提Core Animation 核心动画了。因为这三个图层在核心动画中才能显示出它们的特点和用处。下面是官方文档的说明:模型图层树中的对象是应用程序与之交互的对象。此树中的对象是存储任何动画的目标值的模型对象。每当更改图层的属性..原创 2021-03-07 11:04:35 · 471 阅读 · 0 评论 -
iOS线程和队列的关系
线程与队列说不清道不明的关系:线程是代码执行的路径,队列则是用于保存以及管理任务的,线程负责去队列中取任务进行执行。 我的理解:多个队列的任务可以在一条线程上执行,一个队列的任务也可以在多条线程上执行。个人理解,队列可以包含线程,线程也可以包含队列。dispatch_sync:立马在当前线程执行任务,执行完再往下走,这句话就可以解释很多问题。dispatch_async:不要求立马在当前线程执行任务,可能会开启新线程,也有可能不会。一、画图解释下队列跟线程间的关系1、一个队列对应一...原创 2021-03-06 10:31:04 · 2510 阅读 · 0 评论 -
智能家居设备连接路由的技术AirKiss
AirKiss原理分析一、 AirKiss概述AirKiss技术是一种创新性的信息传递技术。通过该技术可以便捷的向一台 与外界没有建立任何一种实质性连接(包括有线、无线、蓝牙、NFC等)的设备传递信息(可以是环境中Wifi的ssid、密码等信息)。AirKiss 技术示意图如下图所示,智能插座与外界没有建立任何一种实质性连接, 可以称之为信息孤岛。通过 Air Kiss 技术,微信客户端 可以将环境中的 Wifi 的ssid 与密码便捷的隔空传递给智能插座,从而使得智能插座能够快速的接入 Wif...原创 2021-03-03 11:16:44 · 685 阅读 · 2 评论 -
iOS链接外部设备的几种方式
一般iOS开发者做APP开发大部分时候都是通过Http(s)请求跟后台服务器打交道,做一些信息展示和用户交互。很少涉及到去跟外部硬件设备连接的开发。随着近年来车联网和物联网的兴起,智能家居和智能硬件的逐步火热,越来越多的app被开发出来,用来跟硬件设备进行来连接,获取硬件相关信息展示或者发送指令控制硬件来提供服务。故本文就针对iOS的app如何跟外部设备进行连接通信这个问题跟大家交流一下。本文原创,欢迎转载,转载请注明出处,如有不正确的地方恳请各位看官指正。可以分为三大类:第一类是通过网络端口,原创 2021-03-03 11:01:41 · 1995 阅读 · 0 评论 -
iOS 获取当前设备连接Wi-Fi的方法总结
需要引入的库有#import #import #import 1 获取Wi-Fi信息,代码如下:- (NSDictionary *)getIphoneMessage{ NSDictionary *info =nil; NSArray *ifs = (__bridge_transferNSArray *)CNCopySu原创 2017-07-10 11:34:26 · 1820 阅读 · 0 评论 -
WKWebView与JS交互详情.
目录(?)[+]WebKit(展示Web界面)WebKit(WKScriptMessageHandler)WebKit(WKUIDelegate)WebKit(WKNavigationDelegate)WebKit(刷新)WebKit(导航)WebKit(浏览记录)WebKit(进度条)上一篇博文《WebKit(展示Web界面)》讲解了显示Web页面,这一篇博文将讲解使用WKScriptMessa...原创 2018-04-14 15:47:54 · 284 阅读 · 0 评论 -
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 · 187 阅读 · 0 评论 -
sourcetree的一些常用操作
1.克隆远程仓库点击红色箭头处的向下箭头按钮,会出现如图选项,既可以在本地建立仓库,也可以从远程仓库克隆。我这里主要从我自己的GitHub仓库克隆一份代码到我本地。如下图:1.点Clone or download,出现红框链接部分,注意链接如果是https开头的最好是换成SSH协议的链接,因为Git是默认采用SSH协议的,处理速度要比HTTPS要快。2.点击复制按钮,将链接copy到下图中如果在初...原创 2018-04-24 11:38:19 · 3107 阅读 · 0 评论 -
IOS原生生成二维码
一、二维码的生成从iOS7开始集成了二维码的生成和读取功能 此前被广泛使用的ZBarSDK 目前不支持64位处理器,除此之外还有ZXingSDK也可以生成二维码生成二维码的步骤 导入CoreImage框架 通过滤镜CIFilter生成二维码 二维码的内容(传统的条形码只能放数字) 纯文本 名片 URL(可直接跳转网页) 二维码生成的具体代码-...原创 2018-10-23 15:13:26 · 443 阅读 · 0 评论 -
ios 组件化方案
1.阅读本篇文章以前,假设你已经了解了组件化这个概念。最近两年移动端的组件化特别火,但移动端组件化的概念追其溯源应该来自于Server端,具体来说这种概念应该是由Java的Spring框架带来的。Spring最初是想替代笨重的EJB,在版本演进过程中又提供了诸如AOP、DI、IoC等功能,推动了Java程序员面向接口编程,而面向接口编程在面向对象的基础上将对象又抽象了一层,对外提供的服...转载 2018-11-03 16:06:02 · 657 阅读 · 0 评论 -
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 · 587 阅读 · 0 评论 -
针对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 · 563 阅读 · 0 评论 -
YYModel解析2
主体分层YYClassInfo主要分为以下几部分:typedef NS_OPTIONS(NSUInteger, YYEncodingType)与YYEncodingType YYEncodingGetType(const char *typeEncoding);方法 @interface YYClassIvarInfo : NSObject @interface YYClassMeth...原创 2019-03-22 10:56:56 · 349 阅读 · 0 评论 -
ios组件化漫谈
近期随着项目需求越来越多,着手对项目进行业务划分,思考如何提高团队开发效率,就想到了组件化这个话题,这里来分享一下自己的梳理和思考。首先组件化的好处,我就不用多说了,直接进入主题;回到组件化的技术方案,最早上Limboy分享的一遍文章蘑菇街组件化(MGJRouter),接着Casa提出了不同的意见(CTMediator),后来Limboy在Casa的意见上做了进一步优化,最后Bang在前...原创 2019-08-12 15:35:24 · 218 阅读 · 0 评论 -
关于App项目的组件化漫谈(二)
首先要规划项目的整体架构: 项目的整体架构并不是所谓的MVC还是MVVM,在我看来,这些只是代码组织的方式,严格意义上来说并不属于项目架构,项目架构需要你站在更高的维度去看事情,规划项目如何去分层;其实一个项目的架构设计与产品的设计仅仅相关,业务层的代码划分为业务层,第三方库属于通用层,我们可以根据业务层对代码的依赖层度来划分,理所当然业务层就应该在最上面,通用层的代码在最下面,如图...原创 2019-09-09 11:53:49 · 265 阅读 · 0 评论 -
object-c的内存管理
一、为什么要学习内存管理 内存对于任何硬件及软件的重要性不言而喻,而作为硬件与用户交流的中间体软件,对于内存的要求以及如何使用内存,如何合理分配内存是至关重要的,而Objective C语言是C语言的超集,对于内存以及内存管理方面也非常重要。在iOS开发中,内存泄露会严重影响用户体验,而苹果的硬件设备的内存本身内存就不大,所以作为iOS开发人员,掌握内存管理是非常重要的,不过从Xcode 4.原创 2015-08-13 20:05:30 · 599 阅读 · 0 评论