iOS开发
文章平均质量分 79
长沙火山
2015年做个有梦想、肯努力的青年。
展开
-
iOS通过wifi连接硬件设备
app连接硬件,通过socket通信,通过socket设置ssid和密码,在各式各样的硬件上植入软ap,再利用手机连接软ap配置路由的ssid和密码, 然后智能硬件就可以自行连接了路由器了,也就实现了上网的功能.硬件中的软ap连接路由器后,通过我们自己的服务器处理,手机通过4G网络也能够控制智能硬件了。假设您的应用需要连接到家庭智能灯泡,用户可以通过应用控制灯泡的亮度和颜色。:智能设备成功连接到 Wi-Fi 网络后,用户的设备也会自动断开与智能设备创建的热点的连接,切换到指定的 Wi-Fi 网络上。原创 2024-03-19 08:00:00 · 1486 阅读 · 0 评论 -
iOS Bonjour介绍
Bonjour 是苹果提供的一种零配置网络服务发现技术,可以帮助设备在局域网内自动发现和连接到其他设备。使用 Bonjour 技术可以让开发者更容易地实现设备间的网络通信,无需手动配置 IP 地址或端口号。在 iOS 应用程序中,您可以使用 Bonjour 框架来实现局域网内设备搜索和服务发现。原创 2024-03-19 08:00:00 · 533 阅读 · 0 评论 -
Vue动态绑定Class与Style
这样可以根据数据的变化来动态改变元素的样式,实现更灵活的样式控制。通过数组语法,可以根据多个条件的组合来决定元素应该添加哪些类,实现更复杂的样式控制。通过数组语法,可以根据多个条件的组合来决定元素应该具有哪些样式,实现更灵活的样式控制。这样,我们可以根据多个条件的组合来动态控制元素的样式,使页面更具交互性和灵活性。数组语法,可以实现更复杂的样式控制,根据多个条件的组合来动态改变元素的样式,满足不同的需求。通过数组语法,可以根据多个条件的组合来动态控制元素的样式,实现更灵活的样式控制。原创 2024-03-17 12:22:11 · 4835 阅读 · 0 评论 -
Vue生命周期
在开发过程中,可以根据不同的需求在这些生命周期钩子函数中添加自定义逻辑,实现更灵活的控制和交互。Vue生命周期的理解对于开发Vue.js应用程序非常重要,可以帮助我们更好地管理组件和数据的生命周期。在Vue.js中,组件实例有一个完整的生命周期,包括创建、挂载、更新和销毁等阶段。Vue生命周期钩子函数允许我们在组件不同阶段添加自定义逻辑。这些生命周期函数可以帮助我们更好地理解组件的生命周期流程,并在需要时执行相应的操作。在Vue.js中,生命周期函数是一系列钩子函数,用于在组件不同阶段执行特定逻辑。原创 2024-03-17 12:28:52 · 671 阅读 · 0 评论 -
iOS高级理论:CocoaAsyncSocket 介绍与使用
CocoaAsyncSocket为Mac和iOS提供了易于使用和功能强大的异步套接字库,主要包含两个类:GCDAsyncSocket:用GCD搭建的基于TCP/IP协议的socket网络库GCDAsyncUdpSocket:用GCD搭建的基于UDP/IP协议的socket网络库.本文主要介绍 GCDAsyncSocket的使用,他是一个TCP库,建在Grand Central Dispatch上面的。TCP是面向连接的,面向流的,提供高可靠性服务。原创 2024-02-29 22:49:36 · 1816 阅读 · 0 评论 -
iOS高级理论:UDP的介绍和使用
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。Socket的英文原义是“孔”或“插座”。作为BSD UNIX的进程通信机制,取后一种意思。通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,可以用来实现不同虚拟机或不同计算机之间的通信。在Internet上的主机一般运行了多个服务软件,同时提供几种服务。每种服务都打开一个Socket,并绑定到一个端口上,不同的端口对应于不同的服务。Socket正如其英文原意那样,像一个多孔插座。原创 2024-02-29 22:48:33 · 1365 阅读 · 0 评论 -
iOS高级理论:RunLoop
在 iOS 开发中,Runloop(运行循环)是一个重要的概念,它负责处理事件和消息,保证程序在不间断地处理事件的同时保持活动状态。Runloop 是一个事件处理的机制,负责管理事件源和定时器,确保应用程序在不同状态下能够正常运行。RunLoop 实际上是一个对象,这个对象在循环中用来处理程序运行过程中出现的各种事件(比如说触摸事件、UI刷新事件、定时器事件、Selector事件),从而保持程序的持续运行。RunLoop 在没有事件处理的时候,会使线程进入睡眠模式,从而节省 CPU 资源,提高程序性能。原创 2024-02-28 09:00:00 · 1076 阅读 · 0 评论 -
iOS高级理论:内存管理
在 iOS 应用开发中,内存管理是非常重要的一个方面,合理管理内存可以避免内存泄漏和内存过度消耗,提高应用的性能和稳定性。iOS 中的内存管理主要是通过引用计数(reference counting)和自动释放池(autorelease pool)来实现的。原创 2024-02-28 09:30:00 · 1257 阅读 · 0 评论 -
iOS高级理论:面对对象
OC中是这么做的,如果想让一个方法不被外界访问的话,只需要在.m文件中实现这个方法,不要在头文件中进行定义,说白了就是:该方法有实现,没定义,这样外界在导入头文件的时候,是没有这个方法的,但是这个方法我们可以在自己的.m文件中进行使用。但是这里要注意的是:OC中的方法是没有修饰符的概念的,这个和Java有很大的区别,一般都是公开访问的,即public的,但是我们怎么做到让OC中的一个方法不能被外界访问呢?继承是类中的一个重要的特性,他的出现使得我们没必要别写重复的代码,可重用性很高。原创 2024-02-27 09:49:33 · 859 阅读 · 0 评论 -
iOS高级理论:分类和扩展
在 iOS 开发中,分类(Category)和扩展(Extension)是两种常用的机制,用于对现有类进行扩展和增强。它们可以为现有类添加新的方法、属性或协议,而无需修改原始类的源代码。原创 2024-02-27 09:48:50 · 1830 阅读 · 0 评论 -
iOS高级理论:Runtime应用
创建一个UIViewController的分类,重写自定义的ViewDidAppear方法,并在其+load方法中实现ViewDidAppear方法的交换。(2) 开发中常需要在不改变某个类的前提下为其添加一个新的属性,尤其是为系统的类添加新的属性,这个时候就可以利用Runtime的关联对象(Associated Objects)来为分类添加新的属性了。通过使用 Runtime 遍历类的属性,我们可以实现一个通用的归档和解档方法,而无需手动编写大量的归档代码。方法则对归档的数据进行解档,恢复对象的状态。原创 2024-02-26 09:37:52 · 935 阅读 · 0 评论 -
iOS高级理论:Runtime介绍和使用
iOS Runtime 是 Objective-C 的运行时系统,它是一个动态的库,提供了一系列 C 函数和数据结构,用于实现 Objective-C 的动态特性。在 iOS 开发中,Runtime 提供了许多强大的功能,例如动态添加类和方法、消息转发、关联对象等。原创 2024-02-26 09:37:07 · 974 阅读 · 0 评论 -
iOS高级理论:Block的应用
Block 是 Objective-C 和 Swift 中的一种语言特性,可以用来封装一段代码并在需要时执行。原创 2024-02-25 17:37:14 · 803 阅读 · 0 评论 -
iOS高级理论: Block介绍和使用
在 iOS 开发中,Block 是一种闭包(Closure)的概念,可以将一段代码块作为一个对象进行传递和存储,类似于函数指针。Block 可以捕获其定义时所在范围内的变量,并在需要的时候执行这段代码块。Block 的使用可以方便地实现回调、异步操作、事件处理等功能。原创 2024-02-25 17:36:37 · 2702 阅读 · 0 评论 -
iOS高级理论:常用的架构模式
在 iOS 开发中,常用的架构模式有以下几种:MVC(Model-View-Controller)模式:是 iOS 开发中最常见的架构模式。在 MVC 模式中,Model 负责数据处理和业务逻辑,View 负责界面展示,Controller 负责协调 Model 和 View 之间的交互。虽然 MVC 模式简单易懂,但在复杂项目中可能导致 Controller 过于臃肿,难以维护。原创 2024-02-24 17:30:22 · 1912 阅读 · 0 评论 -
iOS高级理论:多线程专题 - (2) GCD信号量的应
这样做的目的是保证在请求结果没有返回之前,一直让线程等待在那里,这样一个线程的任务一直在等待,就不会算作完成,notify的内容也就不会执行了,直到每个请求的结果都返回了,线程任务才能够结束,这时候notify也才能够执行。对计算机了解的都会知道信号量的作用,当我们多个线程要访问同一个资源的时候,往往会设置一个信号量,当信号量大于0的时候,新的线程可以去操作这个资源,操作时信号量-1,操作完后信号量+1,当信号量等于0的时候,必须等待,所以通过控制信号量,我们可以控制能够同时进行的并发数。原创 2024-02-24 10:51:35 · 1215 阅读 · 0 评论 -
iOS面试:4.多线程GCD
进程是指在系统中正在运行的一个应用程序。对于电脑而已,你打开一个软件,就相当于开启了一个进程。对于手机而已,你打开了一个APP,就相当于开启了一个进程。线程是进程的基本执行单位。一个进程中至少会有一条线程,当然也可能会有多条线程。比如你使用QQ音乐听歌,系统会创建一条线程去播放音乐。使用QQ音乐下载歌曲,系统会创建一条线程去下载歌曲。这两个操作是可以同时进行的,也就说一个进程中可以同时运行多条线程。原创 2024-02-23 17:27:50 · 2228 阅读 · 0 评论 -
iOS面试:3.Object-C相关
需要注意的是,Objective-C 的编译过程中还涉及到 Objective-C 运行时库的支持,因为 Objective-C 是一种动态语言,它需要在运行时进行方法调度、消息传递等操作,这些都依赖于 Objective-C 运行时库的支持。在 Objective-C 中,可以将一个 B 类型的对象赋值给 A 类型,因为 Objective-C 是一种动态类型的语言,它使用的是指针来引用对象,而不是直接操作对象本身。在动态类型语言中,变量的类型是在运行时确定的,而不是在编译时确定的。原创 2024-02-23 17:27:03 · 1071 阅读 · 0 评论 -
iOS面试:2.操作系统
虚拟内存是计算机系统中的一种技术,它允许操作系统将部分硬盘空间用作临时的内存扩展,以满足程序运行时的内存需求。虚拟内存的主要作用是扩展计算机的内存空间,使得系统能够同时运行更多的程序或处理更大的数据集,从而提高系统的性能和稳定性。内存扩展虚拟内存允许操作系统将硬盘空间用作临时的内存扩展,当物理内存不足时,系统可以将部分不常用的内存数据暂时存储到硬盘上,从而释放物理内存供其他程序使用。多任务处理虚拟内存使得系统能够同时运行多个程序,每个程序都可以独立地占用一定的虚拟内存空间,而不会相互干扰。原创 2024-02-21 20:44:36 · 860 阅读 · 0 评论 -
iOS面试:1.计算机网络
HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于传输超文本数据(如 HTML 文档、图片、视频等)的应用层协议,是互联网上应用最为广泛的协议之一。HTTP协议建立在TCP协议之上,通过在客户端和服务器之间传输数据来实现通信。无连接性:HTTP 是一种无连接的协议,即每个请求和响应之间是相互独立的,服务器在处理完一个请求后会关闭连接。这种无连接性可以减少服务器的负担,但也会增加建立和关闭连接的开销。无状态性。原创 2024-02-21 20:43:53 · 1310 阅读 · 0 评论 -
iOS 生命周期 (最新最完整)
要知道APP的生命周期,首先要了解一下生命周期的5种状态,结合状态理解生命周期的使用。原创 2023-02-24 13:24:29 · 3022 阅读 · 0 评论 -
iOS 国际化(多语言)
Xcode使用带有 “.strings” 扩展名的文件来存储和检索 程序中使用的所有字符串,以及支持的每种语言。创建完“InfoPlist.strings”(命名随意~),工程目录结构文件如下,单击“InfoPlist.strings”,查看右边的属性,在Localizable栏添加语言。”,选择“iOS”对应的“Resource”中的“Strings File”)。这个时候就可以在对应语言的“InfoPlist.strings”文件中,添加所支持的字符串了。创建一个 “.strings” 扩展名的文件。原创 2023-01-19 14:25:37 · 8377 阅读 · 0 评论 -
iOS 内存泄漏检测 Instruments Leaks
3. 此时,仍然看不到具体的代码位置,需要选择底部的 Call Tree,在弹窗中选择 Invert Call Tree 和 Hide System Libraries,即可显示出具体内存泄漏的代码。4. 在运行过程中如果发现Leak Checks(如图)出现红色X说明检测到内存泄露,将鼠标点击Leak Checks,在下方即可看到内存泄漏的相关信息。把调用层级最深的方法显示在最上面,更容易找到最耗时的操作。3. 在显示的 Leaks 面板中,点击左上角红色点,即可运行内存检测。原创 2023-01-19 13:36:57 · 4360 阅读 · 0 评论 -
iOS YYModel的使用
YYModel支持多样化的数据类型,甚至字典,数组等数据,如果不存在,则该model会自动设置为null,该例子提出使用NSArray和NSDictionary作为数据,效果依然一样。@end不得不说YYModel还是考虑很全面的,不仅支持各种类型数据,甚至考虑到获取到数据的层次关系并没有那么完美,那么这个时候该怎么做呢。return @{@"sex":@"sexDic.sex" // 声明sex字段在sexDic下的sex};}@"name":@"张三",原创 2022-12-22 18:05:00 · 2765 阅读 · 0 评论 -
iOS 图标和文字自定按钮
实现上图标下文字,左图标右文字,右文字左图标设置的按钮。在项目开发中,经常需要用到按钮,系统默认的按钮是图标在左边,标题在右边。但往往实际情况是多变的,有时候图标在右边、有时候图标在上面,这个时候系统的按钮往往无法满足需求,所以我们需要自定义按钮来满足需求的开发。下面提供两种方法来实现按钮图标和文字自定按钮。原创 2022-11-29 16:00:34 · 1120 阅读 · 1 评论 -
iOS AAChartKit 图表库的使用
AAChartKit 项目,是AAInfographics的 Objective-C 语言版本,是在流行的开源前端图表库Highcharts的基础上,封装的面向对象的,一组简单易用,极其精美的图表绘制控件。原创 2022-11-24 15:28:33 · 1979 阅读 · 0 评论 -
iOS 列表页面实时刷新解决方案
客户要求APP客户端每次切换Tab,都需要从服务器去获取最新的数据,所以每次切换Tab,客户端都会去主动刷新接口,以获取最新的数据。但是实际发现,每次切换Tab都去刷新,从用户体验上感觉刷新太频繁了;从性能上体验,没有数据更新也去频繁的请求接口,很消耗网络资源。于是,客户针对这一情况,提出了新的需求:当服务器有数据更新的时候,此时客户端去主动刷新列表接口以获取最新的数据,否则不需要客户端主动去请求接口,直接显示上一次从服务器请求的数据。这样就既做到了用户每次可以看到最新的数据,而且不影响用户体验和性能。原创 2022-11-23 15:17:25 · 2387 阅读 · 1 评论 -
iOS MJRefresh 实现无感刷新
项目开发中用了MJRefres 刷新控件,每次上拉的时候都有个菊花转,需要下拉一下才能看到下一页的数据。产品提出需求,希望列表往下拉能直接出现下一页的数据,不需要出现加载的动画和等待时间。于是着手看了一下MJRefresh的源码,发现其提供了无感刷新(自动刷新)的方法。从MJRefresh的继承图谱来看,下拉的自动刷新类为:MJRefreshAutoStateFooter。我们只需要继承这个类,然后把功能重写一下就可以实现了。自己重新创建一个类:HSWuGanRefreshFooter,继承 MJRefre原创 2022-07-11 10:28:11 · 2133 阅读 · 0 评论 -
iOS MJRefresh 自定义刷新动画
项目开发中用了MJRefres 刷新控件,但是MJRefresh默认的加载样式感觉比较丑,产品觉得需要换个样式,弄的简洁一点。于是着手看了一下MJRefresh的源码,发现其提供了修改样式的方法。从MJRefresh的继承图谱来看,带动画的下拉刷新类为:MJRefreshGifHeader,带动画的上拉刷新类为:MJRefreshBackGifFooter。我们只需要分别继承这两个类,然后把加载动画的功能重写一下就可以实现了。自己重新创建一个类:HSRefreshGifHeader,继承 MJRefres原创 2022-07-11 10:26:19 · 2092 阅读 · 0 评论 -
iOS MJRefresh源码分析
MJRefresh是iOS开发中运用的最多的上拉加载更多和下拉刷新控件,是著名开发者及培训讲师李明杰老师的作品。MJRefresh中主要的类并不多,整个MJRefresh主要类的关系如下图所示:MJRefreshComponent 为整个控件的基类,其本身是一个UIView。2.2 控件的回调函数2.3 添加监听主要是对 contentOffset、contentSize、手势状态进行监听对于监听的处理:2.4 提供刷新,停止刷新接口2.5 提供子类需要实现的方法三、基础的下拉刷新原创 2022-07-11 10:22:54 · 719 阅读 · 0 评论 -
iOS 文件读写
一、沙盒沙盒是每一个iOS应用程序都会自动创建的一个文件系统目录(文件夹),而且沙盒还具有独立、封闭、安全的特点。1、沙盒机制iOS中的沙盒不仅仅是一个文件目录,TA其实更是一种安全体系TA规定了应用程序只能在为该应用程序创建的文件夹(也就是沙盒)内访问文件,不可以访问其他沙盒内的内容(iOS已经部分开放访问)所有的非代码文件都保存在沙盒中,图片、音频、视频、属性列表(plist)、sqlite数据库以及文本文件等。2、沙盒的特点每个应用程序的活动范围都限定在自己的沙盒里不能随意跨越自己的沙原创 2022-05-14 22:10:23 · 1838 阅读 · 0 评论 -
iOS 数组操作
一、数组去重1.1 利用字典Key不能重复的属性NSArray *testArr = @[@"1",@"2",@"3",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9"];NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];for (NSInteger i=0; i<testArr.count; i++) { [dict setObject:testArr[i] forKey:t原创 2022-05-14 22:07:56 · 811 阅读 · 0 评论 -
iOS NSTimer定时器
iOS中定时器有三种,分别是NSTimer、CADisplayLink、dispatch_source,下面就分别对这三种计时器进行说明。一、NSTimerNSTimer这种定时器用的比较多,但是特别需要注意释放问题,如果处理不好很容易引起循环引用问题,造成内存泄漏。1.1 NSTimer的创建NSTimer有两种创建方法。方法一:这种方法虽然创建了NSTimer,但是定时器却没有起作用。这种方式创建的NSTimer,需要加入到NSRunLoop中,有NSRunLoop的驱动才会让定时器跑起来。原创 2022-05-14 22:04:14 · 2924 阅读 · 0 评论 -
iOS 视频方向修正
前言最近在开发一款视频剪辑的App发现一个奇怪的问题,用iPhone手机的相机拍摄的视频,经过剪辑之后导出视频,发现视频被自动旋转了90度。于是,顺着这个问题深入研究了一下,将研究的过程和结果记录一下。一、视频拍摄的方向与角度iOS上内置相机应用录制的mov/mp4视频会产生一个Rotation元数据,表示录制视频时摄像头旋转到了多少角度。其值一般为这四个:0、90、180或270。类似于图片文件的 Exif 信息中的Orientation元数据。Rotation元数据用于播放器确定渲染视频的方向,原创 2022-02-28 13:42:20 · 6401 阅读 · 0 评论 -
iOS 权限设置判断和跳转 - 最全最详细
一、权限设置iOS 10以后,苹果增强了对用户隐私的保护,访问照相机、相册、麦克风、定位、通讯录等,都需要在info.plist 文件中添加权限,而且少一个都不行。根据需要添加,项目中使用了什么,就添加对应的权限。权限字段相册使用权限Privacy - Photo Library Usage Description编辑相册权限Privacy - Photo Library Additions Usage Description相机权限Privacy - Camera原创 2021-12-29 11:46:17 · 7721 阅读 · 0 评论 -
iOS Secure Enclave
Secure Enclave 是一个绝对的安全环境,所以存放的当然也是最高机密的数据。那什么数据属于最高机密的数据呢?一般是用户的生物特征信息,比如指纹信息 TouchID、面部信息 FaceID 等。原创 2021-12-22 17:19:16 · 5092 阅读 · 0 评论 -
2021版安装cocoapods
之前cocopods升级了很多次由于各种报错问题,一直没有升级成功,今天再次升级cocopods,升级成功了。之前升级失败,其实原因不在于cocoapods本身,而是由于要升级cocopods要先升级ruby,升级ruby要手动设置路径,而且有时候还会因为网络的原因导致失败。而升级ruby之前,要先升级homebrew。原创 2021-12-09 10:25:47 · 1433 阅读 · 0 评论 -
iOS 加载大量本地视频优化
一、问题的产生1.1 发现问题最近开发了一个视频剪辑的APP,其中有这么一个功能,对原视频进行剪辑编辑好之后,可以直接导出到相册,同时APP也会将这个视频保存到本地(沙盒),然后APP专门有一个“我的作品”界面来展示所有存储在本地的视频。在自己做测试的时候,发现点击“我的作品”页面,需要比较长的时间才能响应,而且视频越多响应时间越长。于是我猜想可能是因为同时加载大量视频导致的。1.2 分析代码(1) 从沙盒中读取所有视频- (NSMutableArray *)getVideoUrlFromSand原创 2021-12-01 10:59:36 · 1132 阅读 · 0 评论 -
Xcode清理缓存-2023年02月更新
一、清理Xcode中的垃圾文件1、前往Xcode所在的文件目录:~/Library/Developer/Xcode。如下图:2、进入目录后,可以看到Xcode文件中包含了如下几个文件夹:(1) Archives 存放的是Xcode打包时生成的文件,这里面的文件可以全部删掉。 (2) DerivedData 存放的是build生成的项目索引、build输出以及日志,这里的文件可以全部删除。 (3)原创 2017-04-13 20:32:18 · 58922 阅读 · 1 评论 -
iOS TouchID
+ (void)fingerVerify:(void(^)(BOOL result))completion{ LAContext *context = [[LAContext alloc] init]; NSError *err = nil; if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication...原创 2019-11-14 14:52:41 · 441 阅读 · 0 评论