自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(65)
  • 收藏
  • 关注

原创 RxSwift(一)初窥门径

了解响应式编程Rxswift

2023-04-07 20:59:00 3493 4

原创 C++归并排序

最近面试的时候被问到了归并排序,之前学数据结构的时候了解过,但是并没有手动实现过它的原理,今天实现一下。归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。其实也就是利用了递归的思想,把我们的整个序列不断的划分,直到划分到元素为1的N个子序列,然后开始合并。

2022-10-22 20:41:21 295

原创 iOS——frame & bounds

frame: 该view在父view坐标系统中的位置和大小。(参照点是,父亲的坐标系统)bounds:该view在本地坐标系统中的位置和大小。(参照点是,本地坐标系统,就相当于ViewB自己的坐标系统,以0,0点为起点)。下面通过一段简单的代码对比一下。

2022-10-03 19:29:52 827 1

原创 iOS——HashMap

哈希表也称为散列表,是一种常见的数据结构,它提供了快速的插入操作和查找操作,无论哈希表总中有多少条数据,插入和查找的时间复杂度都是为O(1),因为哈希表的查找速度非常快,所以在很多程序中都有使用哈希表。其实哈希是一种思想,将我们的键值对中的键或者关键字与数组的下标所绑定,就比如说我们的学号就可以对应成数组的下标,不过学号对于数组来说可能太大了,我们需要一个函数去处理一下这个数字,这个转化的函数也就是哈希函数。

2022-09-23 16:02:24 1495

原创 iOS——Autoreleasepool底层原理

顾名思义,autoreleasepool也称为自动释放池,类似于C语言中的自动变量,我们可以将对象加入到autoreleasepool中,当其超出其作用域时,调用release释放该对象。在之前探究ARC实现时,我们可以发现ARC将非自己持有的对象加入到了autoreleasepool。下面深入了解一下autoreleasepool的结构。...

2022-08-14 16:08:49 1339

原创 RunLoop解析

先看看官网对他的描述RunLoop是一个处理对象输入源的类,例如Port的调度,触摸事件,UI刷新事件,定时器事件,Selector事件,RunLoop还负责管理Timer事件。RunLoop和Thread对象是一一对应的,我们不能创建RunLoop,只可以获取,这里注意并不是每个Thread都有RunLoop。那么RunLoop的逻辑是什么呢?其实可以抽象的把它理解为跑圈,有事件处理的时候处理事件,在没有事件处理的时候,进入睡眠模式,从而节省CPU资源,底层逻辑是利用Do-while实现的。...

2022-08-13 19:33:08 393

原创 iOS——持久化

/文件路径搜索 FOUNDATION_EXPORT NSArray < NSString * > * NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory , NSSearchPathDomainMask domainMask , BOOL expandTilde);该方法返回值为一个数组,在iphone中由于只有一个唯一路径,所以直接取数组第一个元素即可....

2022-08-09 20:18:37 682

原创 Runtime——KVC,KVO原理

KVC是的缩写,意思是键值编码。在iOS中,提供了一种方法通过使用属性的名称(也就是Key)来间接访问对象属性的方法,这个方法可以不通过方法来访问对象的属性。用KVC可以间接访问对象属性的机制。通常我们使用来替代getter方法,来代替setter方法。只能用来访问当前对象的属性,而keyPath可以通过当前对象访问属性的属性,可以一层一层套下去。...

2022-08-06 07:40:01 569

原创 iOS——weak实现原理

Weak表示弱引用,用weak修饰,描述的引用对象的计数器并不会增加,并且weak指针在引用的对象被释放时自动置为nil,可以解决循环引用问题。那么weak的具体实现原理如何呢?

2022-07-30 17:50:09 2008

原创 ARC在编译和运行做了什么?

探究ARC到底帮我们做了什么?以及ARC部分底层原理

2022-07-22 22:27:57 1148

原创 Runtime——methods成员变量,cache成员变量

在之前分析类的时候,类里面的存储着该类所有的实例方法信息,那么它具体是怎么存储的?查看源码发现其实是一个数组指针,这个数组的大小为(N + 1)* 8个字节(N为分类个数),也就是说这个数组里面存着一些一维数组,指向真正的实例方法列表,也就是分类1的实例方法列表,类本身的方法列表等等。方法列表里面放着一个个实例方法,看看他的定义。可以发现里面就三个指针,所以它只占用了24个字节,这些内存都是在静态区的。元类的同理,只不过保存的是类方法列表。下面分析一下这三个成员变量。当一个对象接受到消息时,会根据它的

2022-06-23 02:23:25 179

原创 Runtime——探索类,对象,分类本质

本文主要探索了iOS底层对象元类类分类的本质以及关系。

2022-06-22 12:08:11 299

原创 多线程四部曲之GCD

GCD为Grand Central Dispatch的缩写。Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法。取名灵感来自于纽约中央火车站(Grand Central Terminal)。开发者只需要定义想执行的任务,并追加到特定的队列中,GCD就会根据情况来决定是否开辟新线程来执行任务。GCD主要分为sync同步以及async异步。queue:队列。block:想执行的任务。:是否等待队列的任务执行结束,以及是否具备开启新线程的能力。他两的

2022-06-12 14:49:37 476

原创 多线程四部曲之pthread

pthread 是一套通用的多线程的 API,可以在Unix / Linux / Windows 等系统跨平台使用,使用 C 语言编写,需要程序员自己管理线程的生命周期,使用难度较大,我们在 iOS 开发中几乎不使用 pthread,但是还是来可以了解一下的。POSIX 线程(英语:POSIX Threads,常被缩写 为 Pthreads)是 POSIX 的线程标准,定义了创建和操纵线程的一套 API。实现 POSIX 线程标准的库常被称作 Pthreads,一般用于 Unix-like POSIX 系

2022-06-06 21:20:43 160

原创 多线程四部曲之NSThread

众所周知在iOS多线程开发主要有四种方式,NSThread就是其中一种。下面是apple官方给出的解释可以看出NSThread是apple封装的一个线程类,开发人员可以对线程进行操作,并且可以监控线程状态。是基于线程使用,轻量级的多线程编程方法(相对和),一个对象代表一个线程该类的创建方法比较简单,大致可以分为动态和静态两种方法。2.也可以通过NSThread的静态方法(类方法)快速创建并自动启动新线程3.此外NSObject基类对象还提供了隐式快速创建performSelector,

2022-06-06 20:32:57 2610 1

原创 C++利用前序序列和中序序列构建二叉树

重建二叉树在数据结构这门课中很容易碰见这个问题,感觉手写的话很容易写出来,但是没有用代码实现过,这里记录一下如何用代码实现。思路:思路:利用前序中序遍历的性质,首先在前序中找到根节点,那么在中序遍历中,根节点的左边一定是他的左子树,右边是右子树,然后根据这个特点,对左和右子树继续进行分治。最后就可以得到返回结点,这里的核心方法肯定还是递归。因为这个题不会重复,利用一下hashMap在中序遍历中对根节点进行定位时,一种简单的方法是直接扫描整个中序遍历的结果并找出根节点,但这样做的时间复杂度较高。我

2022-05-29 21:13:05 1052

原创 iOS——关联对象

关联对象简介associatedObject又称关联对象。顾名思义,就是把一个对象关联到另外一个对象身上。使两者能够产生联系。之前写项目的时候在cell中加入了输入框为了避免输入框内容的复用以及获取特定输入框的文本,需要给UITextField添加一个新的属性indexpath和cell关联。众所周知,分类是无法静态添加成员变量的,所以这里就利用到了Associated Object为该分类动态添加属性。关联对象的使用下面就为NSObject的分类添加一个属性。#import <Foundat

2022-05-29 14:28:46 1296

原创 iOS——SDWebImage源码解析

SDWebImage概述SDWebImage是一个开源的第三方库,它提供了UIImageView的一个分类,以支持从远程服务器下载并缓存图片的功能。它具有以下功能:1.一个异步的图片加载器。2.一个异步的内存+磁盘图片缓存3.支持GIF、WebP图片4.后台图片解压缩处理5.确保同一个URL的图片不被多次下载6.确保非法的URL不会被反复加载7.确保下载及缓存时,主线程不被阻塞。这个框架的核心类是SDWebImageManger,在外部有UIImageView+WebCache 和 UIB

2022-05-21 22:33:26 791

原创 SDWebImage报错——Error Domain=NSURLErrorDomain Code=-1202

错误情况NSURL* url = [NSURL URLWithString:_loginModel.data[@"face"]]; [cell.topImageView sd_setImageWithURL:url placeholderImage:nil completed:^(UIImage * _Nullable image, NSError * _Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageU

2022-05-03 21:57:58 1350

原创 剑指offer——C++打卡

最近开始用c++写算法,浅浅的记录一下打卡题。之后写的题会持续在里面更新!栈与队列(简单)4.25剑指 Offer 09. 用两个栈实现队列思路:题目需要利用两个栈实现队列,队列是一端进一端出,我们可以将两个栈拼接起来,一个栈作为队尾进元素,将这个栈的元素弹出到另一个栈,另一个栈作为队头输出,就可以实现了。代码:class CQueue {public: stack <int> headStack; stack <int> frontStack;

2022-04-25 21:11:08 1333 1

原创 iOS——浅谈Blocks

Blocks?Blocks是C语言的扩充功能,可以用一句话概括:带有自动变量的匿名函数。匿名函数就是不带名称的函数,这在C语言函数中是不被允许的,但block就可以实现这个功能。Blocks模式Blocks语法下面是一个block^{printf(fmt, val);};实际上上面的例子使用了省略方法,完整形式如下:^void (void){printf(fmt, val);};完整的block语法和c函数相比较有两个不同之处:1.没有函数名。2.返回值类型前带有"^"(插入记号,

2022-04-24 18:53:14 1947

原创 iOS——内存分区

内存分区之前写程序时只知道数据是保存在不同内存区域的,但没系统了解过,浅学一下。iOS内存分区主要分为五大块。下面一一讲解一下。栈区(stack)栈区是由编译器自动分配并释放的,是向低地址扩展的数据结构,是一块连续的存储区域,栈顶的地址和栈的最大容量是一开始系统就规定好的,栈是系统的数据结构,对应线程/进程唯一。栈主要存放了函数的参数值:在函数被调用时,其参数会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中。局部变量。栈空间分为静态分配和动态分配两种:静态分配是编译

2022-04-18 21:46:20 2444

原创 iOS——向NSNull和nil发送消息

NSNULL ?什么是NSNull,看上去他和nil应该都表示空,不过nil是一个空指针,而NSNull是继承NSObject的一个类。在网上查了一些资料,大部分解释是NSNull代表了在集合对象中表示空值的对象。因为在OC中集合中nil具有特殊意义,表示结束,所以我们不能给集合中加入nil。但实际上我们可能需要在集合中加入一个空对象,保证集合元素个数,这时我们就可以用到NSNull。这时候打印集合的元素就可以发现有个空对象。如果我们要寻找集合中的空元素时,我们可以直接判断元素是否 == [

2022-04-17 12:10:41 2715

原创 iOS——UISearchController(地图联想搜索Demo)

简介UISearchController是iOS 8 之后推出的一个新的控件, 用于创建搜索条, 及管理搜索事件, 使用这个, 我们可以很容易的创建属于自己的搜索框。搜索框在app开发中是非常常见的,比如说我们要搜索一个地点。这里就利用到了这个控件,简单记录一下。简单使用我们就以上面这个Demo举例实现一个简单的UISearchViewController的使用。UISearchController 让用户在 UISearchBar 上输入搜索关键词,展示搜索结果或者进行其他操作。UISearch

2022-03-27 12:34:16 3887 2

原创 iOS——ARC规则

概述ARC是什么?顾名思义,自动引用计数。苹果的OC中采用了此机制,编译器可以帮助程序员来进行内存管理,无需键入retain,release代码。最近简单学习了一下ARC,简单记录一下。内存管理的思考方式引用计数式内存管理的思考方式就是思考ARC所引起的变化。自己生成的对象,自己所持有。非自己生成的对象,自己也能持有。自己持有的对象不再需要时释放。非自己持有的对象无法释放。这一思考方式在ARC也是可行的,下面理解一下ARC中追加的所有权声明。所有权修饰符当ARC有效时,id类型和对象

2022-03-20 10:41:25 3600

原创 C++——vector容器

简介最近学写了C++简单记录一下。C++在C的基础上引入了模板这一概念,而STL库则为我们提供了许多模板。vector 容器是 STL 中最常用的容器之一,它和 array 容器非常类似,都可以看做是对 C++ 普通数组的“升级版”。不同之处在于,array 实现的是静态数组(容量固定的数组),而 vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预。vector 常被称为向量容器,因为该容器擅长在尾部插入或删除元

2022-03-13 14:31:32 231

原创 iOS——UIPickerView使用

UIPickerViewUIPickerView在iOS开发中是一个很常见的控件,例如计时器选择时间,填写省市区位置时都可以用的上,最近写项目时使用到了这个技术,总结一下。遵循的协议UIPickerView类似于UITableView这类控件,是需要遵循数据源和代理两个协议的。我们在使用前添加这两个协议。@interface ViewController : UIViewController<UIPickerViewDelegate,UIPickerViewDataSource>

2022-02-24 21:08:55 4640

原创 iOS——调用相册换头像

需求在开发APP时,经常会使用到换头像这一功能,在之前的demo中都是从项目中设置好的图片换的,现在用到了系统相册,记录一下用法。点击头像栏,调用相册更换头像。调用系统相册首先在info.plist中加入字段如下:这个是新版本iOS要求的。2.导入相对应的头文件,并添加各自的协议#import <UIKit/UIKit.h>// 系统相机#import <AVFoundation/AVFoundation.h>// 系统相册#import <Ass

2022-02-20 12:57:04 2080

原创 iOS——内存管理

要想用OC写出内存使用效率高而且又没有 bug 的代码,就得掌握其内存管理模型的种种细节。
一旦理解了这些规则,你就会发现,其实 Objective-C 的内存管理没那么复杂,而且有了"自动引用计数"(Automatic Reference Counting,ARC)之后,就变得更为简单了。ARC 几乎把所有内存管理事宜都交由编译器来决定,开发者只需专注于业务逻辑。一 理解引用计数OC语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或者递减的计数器。如果想使某个对象继续存活,那就增加其引用计

2022-02-13 10:49:01 1635

原创 iOS——协议与分类

在OC语言中有一项特性叫做协议(protocol),由于OC不支持多重继承,因而我们把某个类应该实现的一系列方法定义在协议里。协议可以很好的描述接口。** 分类(Category)**也是OC的一种重要特性,利用分类可以直接为当前类添加方法,无需通过继承子类,契合OC语言运行期系统是高度动态的。23:通过委托与数据源协议进行对象间通信对象之间经常需要相互通信,而通信方式有很多种。Objective-C开发者广泛使用一种名叫"委托模式"(Delegate pattern)的编程设计模式来实现对象间的通信

2022-02-06 12:10:53 713

原创 iOS——设置验证码倒计时

情景在日常生活中,我们注册账号时,大多数是通过和手机绑定,会发送一个验证码,从而实现注册,最近写了一个登录注册界面,利用到了这种方法。实现验证码倒计时一开始想到了一种非常简单的思路,发送验证码本身就是一个UIButton,这里可以给UIButton上绑定一个计时器,按下Button时启动计时器,再计时器上添加相对应的响应事件,每一秒刷新一下UIButton配置的文字。下面看一下具体的代码:首先设置三个属性,按钮,计时器,以及一个常量记录时间。// 发送验证码@property (nonato

2022-01-23 08:43:55 533

原创 iOS——UICollectionView

UICollectionView基础:一, UICollectionView简介:UICollectionView是iOS 6.0之后引入的一种UI控件,类似于tableView有相似的代理方法,但UIColletionView的功能更为强大,可以实现瀑布流,根据开发者的喜好去自定义布局。二, 简单的使用UICollectionView下面先实现一个简单的九宫格布局来介绍此控件的一些基本属性。类似于使用tableView,需要实现两个协议。分别为1UICollectionViewDelegat

2022-01-15 21:02:26 3452 2

原创 iOS——FMDB的简单使用

什么是FMDB最近在实现一个简单APP的收藏功能,需要用到数据库,将数据存储到本地,但在iOS中使用C语言函数对原生SQLite数据库进行增删改查操作,是比较麻烦的,FMDB是一个针对libsqlite3框架进行封装的第三方库,它使用OC封装了c语言的API,使用起来比较方便。FMDB的主要类型FMDatabase:一个FMDatabase对象代表一个单独的SQLite数据库,通过SQLite语句执行数据库的增删改查操作FMResultSet:使用FMDatabase对象查询数据库后的结果集FMD

2021-11-14 11:00:08 3499 1

原创 c语言二叉树的遍历

利用拓展先序序列创建二叉树什么是拓展前序序列,其实就是将前序序列中的空孩子做了标记,例如下面的一颗二叉树ABC##DE#G##F### ,其中#号代表空孩子,这样我们可以仅仅只需要一个序列就可以创建一颗二叉树。首先构造树的数据类型// 创建树的数据类型typedef struct Node { char val; struct Node* leftChild; struct Node* rightChild;} BiTree, *BITree;``````c// 根

2021-11-04 17:55:31 1116

原创 iOS——知乎日报小结

引言最近在写知乎日报,今天来总结一下最近遇到的问题。用Manager封装网络请求,之前的博客里记录过,但在一开始不会在MVC中使用,卡了一下进度。根据MVC的原则,请求数据应该在C中,这里在刷新UI时一定要回到主线程,不然会出现数据丢失的现象。- (void)test { [[Manager sharedManager] NetworkQuestSuccess:^(NetWorkModel* _Nonnull mainViewNowModel) { NSLog(@"

2021-10-31 19:46:41 1245

原创 iOS——JSONModel

什么是JSONModel所以JSONModel就是Objective-c的一个开源第三方库,他可以帮我们处理网络请求到的数据,当我们向服务器发送一个请求之后,通过JSONModel把数据转成model就可以很方便我们使用了。如何使用JSONModel首先是需要配置环境,当配置好环境后才可以使用JSONModel。配置环境首先要在终端中配置CocoaPod,这边可以参考一下之前写的一篇文章,Masonry。接下来打开终端,cd到需要使用JSONModel的目录,输入touch Podfile文件,

2021-10-17 13:43:56 737

原创 iOS——实现简单计算器

记录一下最近写的一个计算器APP。实现包含括号以及四则运算的简单计算器,利用MVC设计模式以及Masonry布局。实现界面:首先实现这个界面到了之前学过的Masonry第三方库,对按钮进行了屏幕比例的限制。遇见的一些问题在MVC设计模式中Button事件的处理根据MVC的设计模式,Button事件应该加在C的代码中,这里一开始没有好的思路,后来问了下学长,学了一手。、我们可以利用协议传值,在V的代码中添加事件,但事件函数是在C中实现的,每次点击Button时,C可以得到Button的tag值

2021-10-07 17:26:45 1285

原创 中缀表达式转后缀表达式——c语言栈实现

题意假定运算符集合为{ +、-、*、/、(、)},利用栈将输入的中缀表达式转换成等价的后缀表达式,并输出。输入格式:输入一个字符串表示的中缀表达式(以“#”结束),其中每个操作数用一个小写字母表示。输出格式:将对应的后缀表达式输出。输入样例:a+b-a*((c+d)/e-f)+g#结尾无空行输出样例:ab+acd+e/f-*-g+结尾无空行大体思路所谓后缀表达式,又名逆波兰表达式。计算机遇见后缀表达式的操作:从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶

2021-09-21 16:42:07 5310 11

原创 iOS——单例模式

什么是单例模式所谓单例模式,就是在iOS程序中这个类只存在一个实例变量。无论创建多少次,都是同一个对象。比如说我们在一个控制器中已经创建了一个text对象,这个对象在每个控制器的属性都是一样的,当我们需要在另一个控制器再创建他时,就会显得很多余,这时候我们就可以使用单例这一设计模式。下面是单例官方给出的示意图:实现单例模式创建方法 —— 一般都是把share+类名这个方法写在.h文件来被调用,单例模式的创建一般不用alloc和init来调用。#import <Foundation/Foun

2021-09-21 16:02:59 206

原创 算数表达式求解

题目要求完成简单的数学表达式的求值问题。假设表达式仅含“加、减、乘、除”四种运算,所有运算对象均为整数。运算结果也是整数,若出现除法,则必然能整除。输入格式:输入一个算术运算式,以“#”结尾,其中运算数都是整型。输出格式:输出运算结果,运算结果也是一个整数。输入样例:34+75/5-4*2#结尾无空行输出样例:41结尾无空行核心思路可以设置两个虚拟栈,一个用来存储数字,一个用来存储符号,遇见数字压入栈中,遇见符号则比较与符号栈栈顶符号的优先级,若优先级大于栈顶符号那么压入栈中,若优

2021-09-20 14:58:56 1342 2

空空如也

空空如也

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

TA关注的人

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