iOS开发
文章平均质量分 82
iOS开发
ReyZhang
专注移动ios平台的软件开发,多年的一线研发经验,实战经验丰富,只为你呈现有价值的信息。据说关注我的人,都薪资翻倍了[笑脸]
展开
-
如何分析 iOS 中的 Crash logs
当你收到不可读的崩溃信息时,你可以在 Xcode 的帮助下对崩溃日志进行符号化。作为开发者,识别符号并确保能够修复这个崩溃至关重要。我们很多开发者常用一些在线平台来统计和解决崩溃,比如 Firebase 和 Bugly 平台,它们将上报我们的线上崩溃信息日志。但是,在某些情况下,我们可以从控制台提取对应的崩溃文件,比如 IPS 文件,在读取这些日志之前,需要对符号进行符号化。今天就来讲讲相关的内容。转载 2024-06-21 09:45:34 · 118 阅读 · 0 评论 -
ios多个网络请求之间的并行与串行场景的处理
在日常开发中我们总是会和网络打交道,从服务端拿数据渲染UI、上传数据到服务器、登陆等,那么就会遇到一些问题。eg:当用户登陆完毕后才获取数据渲染UI或者是多个网络请求从服务端拿到多个数据后,才进行下一步的操作,那么对网络请求之间顺序的控制是十分重要的,本文对这两种情况进行总结,如有不足之处,请多多指教。同时本文只提供了部分截图,其他运行效果可自行尝试。情景一:多个网络请求执行(无序)完后,在执行其他操作示例代码中用到的宏定义:#define GlobalQueue dispatch_get_glo.转载 2022-04-05 16:57:36 · 2659 阅读 · 0 评论 -
iOS直播:评论框与粒子系统点赞动画
目录前言效果预览评论框列表添加评论从下往上显示支持昵称颜色给出NSAttributedString点赞动画前言最近做了直播功能,其实难度不是说很大,主要是方案和SDK的选择、整个直播流程的异常处理和优化,还有第三方SDK的填坑。不过本文只是记录下评论框和点赞效果的实现,其他的是用第三方SDK,觉得没什么好分享的,只是了解了直播流程和开发中会遇到的问题。但看到效果还是蛮激动和蛮有成就感的,这个主要是技术本身带来的。效果预览评论框细化需求:显示评论内容从下往上显示最大支持1000条不同人转载 2022-04-21 16:01:40 · 1258 阅读 · 0 评论 -
iOS WebRTC多人音视频建立的流程
前言本文主要以“代码是最好的注释”为基点,介绍在处理iOS端多人音视频的建立流程。六大事件join : 加入房间offer : 本端群发 offer及接收对端offer的处理answer : 本端发送answer及接收对端发来answer的处理ice_candidate : 对端的网络地址通过 socket 转发给本端new_peer: 成员进入remove_peer: 成员离开join首先,多人音视频的发起者,通过信令发送’__join’ 加入房间消息。信令服务器收到消息后,原创 2022-01-12 17:59:49 · 3762 阅读 · 0 评论 -
RAC ReactiveCocoa 使用小集
前戏我个人非常推崇ReactiveCocoa,它就像中国的太极,太极生两仪,两仪生四象,四象生八卦,八卦生万物。ReactiveCocoa是一个高度抽象的编程框架,它真的很抽象,初看你不知道它是要干嘛的,等你用上了之后,就发现,有了它你是想干嘛就干嘛,编码从未如此流畅。在此我不会讲ReactiveCocoa的原理,因为不能讲明白的才叫抽象。我也不会提及相关概念。我只是让你看看我用着它是有多爽。代码的四十八手1.察值 RACObserve你别动,你一动我就知道。(观察者RACObserve)@w转载 2021-12-22 12:01:18 · 253 阅读 · 0 评论 -
iOS开发中用到的自定义UI库
本文中的UI组件,是作者在移动应用开发中都用到过的。 确实,找到对的三方库可以快速帮助我们构建App, 极大程度上提高了生产力。 如果你也有不错的三方库要推荐,不仿在评论区给我留言。 如果在其中能找到你想要的库,也欢迎你的收藏,点赞。 thx原创 2024-06-27 17:55:25 · 404 阅读 · 0 评论 -
JXCategoryView的使用总结
可以在初始化时指定 titles属性赋值, 如果需要动态显示titles, 则可以在处理后,通过 reloadData 进行重载。根据协议声明来看, listView需要协议的实现者必须 实现才可以。的对象(一般是viewcontroller)这个回调需要返回实现了。原创 2024-06-25 09:57:29 · 781 阅读 · 0 评论 -
ios 开发中使用Masonry设置极限约束以及优先级
某个控制器上的view上有两个label,左、右两边各一个,两者之间的间距为10pt,左、右两边label的宽度最少为100,但当两个label上的文字都很多的时候首先左侧的label上展示的文字更多。对某个控制器上的view上的label进行布局,要求其右侧至少与view水平方向的中心处对齐,宽度随着文字的增加逐渐变宽,但其右侧距离view右侧至少10pt.使用Masonry对UILabel进行约束,设置其宽度的最小约束和距离右侧的最大距离。这是需要使用Masonry设置UILabel抗压缩的优先级。转载 2024-02-29 15:47:59 · 658 阅读 · 0 评论 -
iOS底层 RunLoop深入理解
前言RunLoop:翻译过来是运行环路(中式翻译: 跑圈)。我们在创建命令行项目和创建ios项目时,发现命令行项目当最后一行代码执行完后项目就自动退出了,而ios项目确可以一直运行,知道用户手动点击退出按钮。这就是因为ios项目在main函数中自动创建了runLoop,从而可以使项目可以一直响应用户的操作。int main(int argc, char * argv[]) { @autoreleasepool { //这行代码 会自动创建主线程的RunLoop转载 2022-02-15 11:00:06 · 691 阅读 · 0 评论 -
RunLoop的实际使用
在iOS中是一个很重要的组成部分,对于任何都必须使用才可以连续处理不同的事件,而就是模型在iOS中的实现。在前面的几篇文章中,我已经介绍了Runloop的底层原理等,这篇文章主要是从实际开发的角度,探讨一下实际上在哪些场景下,我们可以去使用RunLoop。在实际开发中,我们通常会遇到的创建,比如说,这就可以在一个常驻线程来发送心跳包,而不干扰主线程的行为,再比如,这也可以在一个常驻线程中来处理。以前在Objective-C中使用的AFNetworking 1.0就使用了RunLoop来进行线程的保活。值得转载 2022-06-09 19:45:00 · 1049 阅读 · 0 评论 -
iOS底层 Runtime深入理解
前言Runtime是近年来面试遇到的一个高频方向,也是我们平时开发中或多或少接触的一个领域,那么什么是runtime呢?它又可以用来做什么呢?什么是Runtime?平时项目中有用过么?OC是一门动态性比较强的编程语言,允许很多操作推迟到程序运行时再进行OC的动态性就是由Runtime来支撑和实现的,Runtime是一套C语言的API,封装了很多动 态性相关的函数平时编写的OC代码,底层都是转换成了Runtime API进行调用具体应用利用关联对象(AssociatedObject)给分类转载 2022-02-14 13:43:37 · 2230 阅读 · 0 评论 -
OC runtime 运行时详解
一、简介1.1 什么是RuntimeRuntime是一套底层纯C语言API,我们编写的OC代码最终都会被编译器转化为运行时代码,通过消息机制决定函数调用方式,这也是OC作为动态语言使用的基础。1.2 消息机制的基本原理在Object-C的语言中,对象方法调用都是类似[receiver selector] 的形式,其本质:就是让对象在运行时发送消息的过程。而方法调用[receiver selector]分为两个过程:编译阶段[receiver selector] 方法被编译器转化,分为.转载 2021-12-29 21:50:03 · 900 阅读 · 3 评论 -
iOS底层 Block的本质与使用
1、block的基本概念及使用Block是一种特殊的数据结构,它可以保存一段代码,等到需要的时候进行调用执行这段代码,常用于GCD、动画、排序及各类回调。Block变量的声明格式为: 返回值类型(^Block名字)(参数列表);//声明一个没有传参和返回值的blockvoid(^myBlock1)(void) ;//声明一个有两个传参没有返回值的block 形参变量名称可以省略,只留有变量类型即可void(^myBlock2)(NSString *name,int age);//声明转载 2022-03-01 17:52:00 · 764 阅读 · 0 评论 -
iOS内存泄漏
前言根据内存区块的引用状态划分内存:缓存内存(Cached memory)泄漏内存(Leaked memory)废弃内存(Abandoned memory)僵尸内存(Zombies memory)缓存内存:正常使用的内存泄漏内存:没有引用也没有被释放的内存。可以用leaks检测到,MRC常见,ARC多为Core相关库未release导致废弃内存:内存仍存在引用,但是无法被使用到。无法用leaks检测到,可尝试使用Allocations排查,一般为循环引用导致一、内存分类根据内存区块的转载 2022-04-05 13:36:33 · 1790 阅读 · 0 评论 -
UIPanGestureRecognizer进行视图滑动并处理手势冲突
首先我们肯定是给sourceVC的view上添加平移手势 UIPanGestureRecognizer手势的实现方法中根据 Pan手势的三种状态 进行sourceVC的view的origin的处理首先介绍一下 几个方法:由于我们的sourceVC上存在tableview, 所以会导致tableview的滑动和pan滑动的 手势冲突 , 这也是为什么在上滑动过程中我屏蔽掉了tableview的scrollEnabled。但是当我们sourceVC滑动到上边界后,我们解开了tableview的滑动转载 2021-12-13 11:36:08 · 1188 阅读 · 0 评论 -
ios 不常用的__attribute__
之后执行, 因为 dyld(动态链接器)最开始会先通知 objc runtime 去加载其中所有的类,每加载一个类时,它的。指定函数的执行,是在dealloc之前。在指定的函数中,可以传入一个形参,参数就是cleanup修饰的变量,形参是一个地址。在父类的方法后面添加,那么子类调用该方法必须实现 [super thisMethod],否则会黄色警告。如果某个变量未使用,会提示unused xxx,可以通过unused消除这个警告。随之调用,全部加载完成后,dyld 才会调用所有的。转载 2023-03-31 15:05:03 · 97 阅读 · 0 评论 -
iOS 组件化的二进制化
背景刚加入新的公司,接触到新公司的代码以后,心中是一篇翻江倒海,不是因为项目代码有多优秀,多牛逼,而是因为这是一个7年的老项目,期间经历过不知多少个程序员的手,项目简直是面目全非,各种重复的第三方库,代码耦合严重,不同时期的代码风格及开发模式完全不一样,造成项目过大,编译花费很多时间。现在的同事们正在想办法优化项目,在使用组件化的发开模式,减少与项目中老代码及第三方重复库的耦合。因此,一些老的代码和一些已经不怎么更新且非常稳定的第三方库进行二进制处理,加快编译速度,同时在未来的开发中能更好进行整合和淘汰转载 2021-11-30 17:26:41 · 1282 阅读 · 0 评论 -
Builder Pattern 在 Objective-C 中的使用
在说 Builder Pattern 之前,我们先来看看一个场景。假设我们要预定一个 iPhone 6,要 64G 的,金色的,用代码表述大概是这样// PFX 是一个前缀,因为直接写 iPhone6 不符合类名大写的习惯,写成 IPhone6 更是怪异 ╮(╯▽╰)╭PFXiPhone6 *iphone = [[PFXiPhone6 alloc] init];iphone.storage = 64;iphone.color = [UIColor goldenColor];也可以是另一种方式P转载 2022-04-20 09:55:45 · 137 阅读 · 0 评论 -
用Block实现链式编程
前言一直在用Masonry,对其链式编程很敢兴趣。于是稍微看了下下其代码的实现。个人理解Masonry的优势主要在于:能够将视图的约束代码聚集起来,方便代码的阅读与修改。链式编程是将多个操作(多行代码)通过点号(.)链接在一起成为一句代码,以增强代码的可读性。核心思想:方法的返回值是blockblock必须有返回值(self,即对象本身)block参数为需要操作的值Masonry的应用首先看Masonry的应用:UIView *demoView = [[UIView alloc] in转载 2022-04-20 10:48:39 · 449 阅读 · 0 评论 -
Mac 电脑下载 AppStore 中的 ipa 软件包详细流程
包的软件,点击添加,然后等待安装,如果你手机上没有这个软件,那么会直接安装成功,但是需要的是安装冲突,也就是你手机上有这个软件,然后再通过这个操作去安装触发冲突弹窗,这个时候下载软件的。,到了个人文件夹之后,需要找到资源库,但是资源库是隐藏文件夹,所以需要显示隐藏文件夹,显示隐藏文件夹的快捷按键是。5、这边也是第一次安装成功,然后再次添加,触发了安装冲突,停留在这里,不要去点任何按钮,点了。2、电脑连接手机,并信任,在所有设备中,选中设备,然后点击顶部的加号,选中。,那就等等,或者换个好点的网。转载 2023-07-25 11:57:04 · 1210 阅读 · 0 评论 -
App内跳转到百度、高德第三方地图导航
项目里遇到根据经纬度跳转第三方导航的需求,在网上找了一下,发现都是千篇一律的文章,而且不能正确显示目的地地址,无果后去百度和高德地图官网查找,位置十分隐蔽,给大家分享下。转载 2023-06-29 17:55:59 · 2267 阅读 · 0 评论 -
iOS 高德地图实现大头针展示,分级大头针,自定制大头针,在地图上画线,线和点共存,路线规划(驾车路线规划),路线导航,等一些常见的使用场景
前言本项目主要是基于高德地图实现了大头针展示,分级大头针,自定制大头针,在地图上画线,线和点共存,路线规划(驾车路线规划),路线导航,等一些常见的功能。不多说了,直接上图吧。一. 普通大头针展示这个不多说,请求数据,将数据转化成大头针对象,添加到地图上,实现定制大头针的代理方法即可,如果有点击大头针的需求,和取消的需求,实现两个代理即可,这个不多说,直接看代码就可以了。二.分级大头针大头针展示有的时候根据需要,不同类型的大头针用不同的图片来展示,就比如说优惠活动吧,有优惠活动的商店用优惠的图标,转载 2021-12-20 10:26:47 · 3836 阅读 · 0 评论 -
iOS 屏幕旋转的实践解析
iOS 屏幕旋转的实现涉及到一堆枚举值和回调方法,对于没有做过旋转相关需求的开发来说,可能一上来就晕了,所以我们先动手,让屏幕转起来吧。实现旋转的方式主要有两种,跟随手机感应旋转和手动旋转,接下来对这两种方式进行逐一介绍。转载 2023-06-26 10:20:56 · 435 阅读 · 0 评论 -
xcode历史版本下载
较早之前做过一个项目,当时使用swift 3.x开发。 项目结束后就没再有新需求与更新。 但最近呢需要对项目的某些功能进行调整,项目又重新被拾了起来。 我们知道现在的swift 版本已经到了 5.x, 相应的语法上较 3.x版本也有了不小的变化。使用最新版本的xcode都已经不支持swift 3.x的 swift version. 所以目前面临两种方案: - 升级项目到swift 5.x (成本较大)- 开发工具xcode降版本原创 2023-04-26 13:41:35 · 1665 阅读 · 0 评论 -
开发并上传静态库到CocoaPods
1、基于pod自动创建项目(演示项目名:XHLib)执行命令pod lib create XHLib。创建过程中会询问以下几个问题:What language do you want to use?? [ Swift / ObjC ] > ObjCWould you like to include a demo application with your library? [ Yes / No ] > YesWhich testing frameworks will you us转载 2022-03-14 15:12:26 · 890 阅读 · 0 评论 -
美团好文:从预编译的角度理解Swift与Objective-C及混编机制
本文涉及面较广,篇幅较长,阅读完需要耗费一定的时间与精力,如果你带有较为明确的阅读目的,可以参考以下建议完成阅读:随着 Swift 的发展,国内技术社区出现了一些关于如何实现 Swift 与 Objective-C 混编的文章,这些文章的主要内容还是围绕着指导开发者进行各种操作来实现混编的效果,例如在 中开启某个选项,在 中增加某个字段,而鲜有文章对这些操作背后的工作机制做剖析,大部分核心概念也都是一笔带过。正是因为这种现状,很多开发者在面对与预期不符的行为时,亦或者遇到各种奇怪的报错时,都会无从下手,转载 2022-06-22 20:00:00 · 786 阅读 · 0 评论 -
iOS小技能:合成指令@synthesize的应用
1、属性合成指令,主动指定使用的名称2、如果使用了修饰了某个属性,再重写这个属性的方法时会报错3、一旦重写了属性的方法,编译器默认提供的的成员变量就不存在了 ,籍此来保护变量不会被不恰当的访问,所以我们可以使用 synthesize主动指定属性使用的成员变量名称。这样解决了如上报错的问题objective-c下如果某属性的都要重写的话需要声明实例变量。使用property的时候,单独重写任意一个方法都不会报错,但同时重写set get方法就会报错。声明实例变量第二种办法1.2 synt转载 2022-06-14 18:45:00 · 894 阅读 · 0 评论 -
iOS中isKindOfClass和isMemberOfClass
开发中经常会使用 判断对象是否是某个类或者是其父类(整个继承链上的类),很少会用到 ,本文就从源码层面来探索他们之间的关系。转载 2022-06-06 19:00:00 · 438 阅读 · 0 评论 -
iOS 手势UIGestureRecognizer详解
一、引言在iOS系统中,手势是进行用户交互的重要方式,通过UIGestureRecognizer类,我们可以轻松的创建出各种手势应用于app中。关于UIGestureRecognizer类,是对iOS中的事件传递机制面向应用的封装,将手势消息的传递抽象为了对象。二、手势的抽象类——UIGestureRecognizerUIGestureRecognizer将一些和手势操作相关的方法抽象了出来,但它本身并不实现什么手势,因此,在开发中,我们一般不会直接使用UIGestureRecognizer的对象,而转载 2022-05-06 11:42:41 · 2169 阅读 · 0 评论 -
iOS 本地化简明指南
概括iOS 本地化主要包含这几部分的工作:InfoPlist 中属性的本地化。storyboard/xib 本地化。字符串本地化。图片本地化。本地化原理。相关脚本。本地化准备工作InfoPlist 中属性的本地化新建 String File,命名为 InfoPlist.strings。当然这些资源可以放在某个目录下,方便管理,比如说 Resources目录。然后进行本地化设置。其中 CFBundleDisplayName 是 InfoPlist 文件中的属性,用于展示 A转载 2022-05-03 13:19:13 · 1683 阅读 · 0 评论 -
NSOperation相关知识点
思考题:有任务B和C依赖于任务A,B和C可以并发执行,在B和C都执行完毕,执行任务D(主线程更新UI),如何用NSOperation实现?GCD如何实现?工作中其实没怎么用到NSOperation,主要用的还是GCD,NSThread,无奈面试总要问,那就带着问题把它就搞清楚吧.相关的类,APINSOperation抽象父类,不应该直接使用他NSInvocationOperationNSBlockOperation系统封装的继承自NSOperation的类,可以直接使用转载 2022-04-29 11:52:55 · 223 阅读 · 0 评论 -
pod引用第三方库的几种方式
前言pod引用库的原理,本质上是去找.podspec文件,podspec中包含库的地址及最新的版本号(tag标签),如果pod时没有指定版本,则pod install时会去下载podspec文件中指定的最新版本,如果pod时指定了版本规则,则pod install会按照此版本规则去下载指定的版本例如想引用YBUtils这个库,有三种方法:1. 直接从官方的pod repo中引用 pod 'YBUtils' //引用该库的最新版本 pod 'YBUtils', '~>0.1.0' //引用该转载 2022-04-18 14:35:44 · 3090 阅读 · 0 评论 -
IOS电商首页如何布局
假设首页的布局如上图,包含:广告、九宫格、精品推荐、下拉cell,如外再加上系统导航和Tabbar。怎么样实现比较简单快捷方便呢。推荐使用UITableView。思路,整体页面UITableView,每个模块是一个HeaderView。Banner广告: UITableView》HeaderView》第三方轮播广告插件九宫格菜单: UITableView》HeaderView》自定义UICollectionView上下滚动文字:UITableView》HeaderView》自定义UIView+第.转载 2022-04-13 16:09:02 · 417 阅读 · 0 评论 -
iOS 视频边下边播(缓存,预加载)
背景在有多个视频链接需要连续切换播放时,视频播放之前要等待视频资源加载完成,切换视频时需要等待很久,已经播放过的视频也需要重新加载才能再次播放,影响用户体验。优化点边下边播:视频播放时,不受网络状况限制,播放流畅缓存:已经播放过的视频,将视频资源缓存在本地,再次播放时直接读取缓存预加载:切换视频时,无缝衔接,视频秒播实现方案本地代理服务器在iOS本地开启Local Server服务,然后使用播放控件请求本地Local Server服务,本地的服务再不断请求视频地址获取视频流,本地服务请求转载 2022-04-13 10:57:01 · 5745 阅读 · 0 评论 -
Runtime面试题
一、objc 对象的 isa 的指针指向什么?有什么作用?指向他的类对象,从而可以找到对象上的方法详解:下图很好的描述了对象,类,元类之间的关系:图中实线是 super_class 指针,虚线是 isa 指针。1.Root class (class)其实就是 NSObject,NSObject 是没有超类的,所以 Root class(class)的 superclass 指向 nil。2.每个 Class 都有一个 isa 指针指向唯一的 Meta class3.Root clas转载 2021-11-22 13:36:54 · 477 阅读 · 0 评论 -
iOS app秒开H5优化探索
背景为了快递迭代、更新,公司app有一大模块功能使用H5实现,但是体验比原生差,这就衍生了如何提高H5加载速度,优化体验的问题。此文,记录一下自己的心路历程。腾讯bugly发表的一篇文章《移动端本地 H5 秒开方案探索与实现》中分析,H5体验糟糕,是因为它做了很多事:初始化 webview -> 请求页面 -> 下载数据 -> 解析HTML -> 请求 js/css 资源 -> dom 渲染 -> 解析 JS 执行 -> JS 请求数据 -> 解析渲.转载 2022-04-10 11:51:53 · 1230 阅读 · 0 评论 -
iOS中的投屏方案
前言目前已知的iOS中的投屏方案有如下几种:ReplayKit录屏直播ReplayKit Live与广播UI /上传扩展iOS9中引入了ReplayKit, 让开发者有了一定的获取屏幕数据的能力. 并在iOS10和iOS11中继续扩展了ReplayKit的能力. 但还是有很大的限制, 比如在使用ReplayKit的api时只能录制当前应用的应用, 无法在应用进入后台之后继续录屏. 如果使用系统级别的屏幕录制,又无法获得每一帧的数据,只能获得最后录取的单个视频. 这样对第三方的开发有了非常大的限制.转载 2022-04-05 12:50:02 · 3691 阅读 · 0 评论 -
制作自定义的Framework时遇到Include of non-modular header inside framework module ‘xxx‘
前言在项目中自定义了一个framework,但是在编译的过程中遇到如下这个问题:Include of non-modular header inside framework module ‘NetWorkFramework’分析原因我在自定义framework的*.h文件中引入了我需要公开的头文件如图:在h文件中添加如下引用但是在Build Phases 的Headers中是如下设置:这里的GKNetworkAPI.h文件没有在Public里面,所以导致工程报错如下:解决办法1转载 2022-03-30 11:33:06 · 1848 阅读 · 0 评论 -
CoreAnimation动画使用详解
介绍Core Animation动画库是开发中常用的工具之一,简称是CA,所以动画类都是CA开头。所有的动画类都在 QuartzCore 库中,在iOS7之前使用需要#import <QuartzCore/QuartzCore.h>, iOS7之后系统已经将其自动导入了。CoreAnimation动画都是作用在layer上。先来看下动画类的层级关系:关于上图中的层级结构只需要了解一下,用的多了,自然就记住了。本篇只讲述CABasicAnimation、CAKeyframeAnimatio转载 2022-03-21 17:35:22 · 656 阅读 · 0 评论 -
iOS 获取用户的本机手机号实现「一键登录」
电信运营商提供的SDK可以直接从运营商数据网关中获取当前流量卡的手机号码,省去了用户输入手机号到接收短信输入验证码的整个过程,可将用户的登录耗时减少至1.5秒,大大降低了用户的使用门槛。在使用抖音和西瓜视频APP时发现一个有趣的现象:连接到蜂窝网络后,打开抖音或西瓜视频,点击登录,登录页面会自动填入本机手机号,可直接一键登录。我们知道:iOS系统是没有可以直接获取用户手机号信息的API的。那么,抖音和西瓜视频是如何做到的呢?实际上,问题的答案在登录页面就已经告诉了我们:「认证服务由中国移动提.转载 2022-02-09 10:20:19 · 6874 阅读 · 1 评论