![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
iOS
文章平均质量分 88
Tuski-
希望都是惊喜
展开
-
NSNotificationCenter底层探究
文章目录简单介绍及使用swift版使用ObjectiveC版使用底层NSNotificationCenter - 消息中心named表nameless表wildcard链表添加观察者发送通知移除通知参考文献简单介绍及使用通知,简单来说就是,一方使用name发送通知,持有与之相同name的另一方接收通知并进行处理(如果添加的观察者name为空,那么就会接收所有通知)。特点是基本上不用考虑其它影响因素,只需要使用同样的通知名称,监听该通知的对象(即观察者)再对通知做出反应即可。降低耦合度swift版使用原创 2021-04-21 17:58:17 · 614 阅读 · 0 评论 -
URL Scheme
文章目录前言简介概览细则URL Scheme的用法参考文献前言由于苹果推出了“沙盒机制”,各个APP之间不能互相访问,但是我们在使用时经常会出现APP之间跳转的情况,这就是URL Scheme的用处了简介URL Scheme类似于URL,可以通过该APP的URL Scheme来定位到该APP,当然定位只是最基本的用法概览things:///add?title=正文内容¬e=备注连接头:things,它是启动一个应用的URL,比如:weixin连接头和命令之间的:,还有//或者原创 2021-04-06 14:18:55 · 615 阅读 · 0 评论 -
delegate、NSNotification、KVO、block
文章目录delegateNSNotificationKVOblock对比参考文献在iOS开发中,经常会碰到传值的问题,我们通常有四种方法来解决:delegate 代理委托NSNotification 通知KVO 键值观察block 闭包分别来说说使用它们的场景:delegate代理模式的基本使用流程是:一个controller定义了一个协议,协议里有若干个方法,一个对象如果想作为controller的delegate,就必须得实现这些方法,也就是controller委托另一个对象作为co原创 2021-03-31 12:35:00 · 167 阅读 · 0 评论 -
KVC原理及应用场景
文章目录KVC使用基本使用多重属性赋值字典转模型模型转字典KVC 原理调用`setValue:forKey:`方法顺序调用`Value:forKey:`方法顺序KVC使用基本使用声明的类:// .h文件@interface ModelStudent : NSObject@property (nonatomic, copy) NSString *name;@property (nonatomic, assign) NSInteger sex;@end// .m文件#import "原创 2020-11-09 21:24:28 · 323 阅读 · 0 评论 -
KVO的使用和本质
文章目录KVO的使用添加KVO后改变KVO本质手动调用KVO参考文献KVO的使用之前写过关于KVO原理的文章,最近在复习这里,再回去看感觉不是很清晰,就再写一篇吧KVO的全称是Key-Value-Observing,人称键值监听,就是监听某个对象属性值的改变KVO的使用很简单,其实就是给某个属性添加一个监听者,然后这个属性的值改变后,触发回调方法 self.student1 = [[ModelStudent alloc] init]; _student1.age = 10;原创 2020-11-05 19:02:29 · 210 阅读 · 0 评论 -
iOS 单例
参考文献iOS-单例的正确写法文章目录参考文献介绍单例单例的代码实现不使用GCD的方式使用GCD关于allocWithZone:介绍单例单例类,在整个项目中只有一个实例,并提供一个类方法供全局调用,在编译时初始化这个类,然后一直保存在内存中,到程序退出时由系统自动释放这部分内存一般在程序中,经常调用的类,如工具类、公共跳转类等都会采用单例模式在程序中,一个单例类在程序中只能初始化一次,为了保证在使用中始终都是存在的,所以单例是在存储器的全局区域,在编译时分配内存,只要程序还在运行就会一直占用内原创 2020-11-01 17:16:50 · 428 阅读 · 1 评论 -
GCD的使用
文章目录线程和队列的关系队列创建队列获取标记符任务创建(dispatch_sync和dispatch_async)线程和runloop队列使用时可能用到的其他APIdispatch_set_target_queue变更队列优先级dispatch_barrier_async 栅栏方法dispatch_after 延时执行方法dispatch_once 一次性代码(只执行一次)dispatch_apply 快速迭代方法dispatch_group 队列组dispatch_group_notify 监听dispa原创 2020-09-23 13:23:11 · 354 阅读 · 0 评论 -
Category探究
文章目录Category的介绍Category的使用根据Category源码进行剖析Category的特点关于添加属性方法重名参考文献Category的介绍Category是Objective-C 2.0之后添加的语言特性。分类、类别其实都是指的Category。Category的主要作用是为已经存在的类添加方法。也可以说是将庞大的类代码按逻辑划入几个分区。Objective-C 中的 Category 就是对装饰模式的一种具体实现。它的主要作用是在不改变原有类的前提下,动态地给这个类添加一些方法原创 2020-09-21 19:29:16 · 167 阅读 · 1 评论 -
iOS以实例讲解响应者链
文章目录什么是响应者链响应者 Responder之前讲过响应者链的概念、程序和作用,但感觉有点枯燥,不太好理解。这篇博客用一个小demo来讲解一下方法借鉴自:iOS开发 - 事件传递响应链和iOS响应者链彻底掌握什么是响应者链iOS响应者链(Responder Chain)是支撑App界面交互的重要基础,点击、滑动、旋转、摇晃等都离不开其背后的响应者链,所以每个iOS开发人员都应该彻底掌握响应者链的响应逻辑,本文旨在通过demo测试的方式展现响应者链的具体响应过程,帮助读者彻底掌握响应者链。响应者原创 2020-08-06 18:11:11 · 618 阅读 · 0 评论 -
使用Runtime运行时方法修改系统自带UI控件方法
引出我们在写APP时有时需要查看是否调用了该方法,而对于系统自带的UI控件,我们一般无法修改其方法或者修改之后会不按照你的想法运行,这时我们就想自己去写一个方法去替换它方法例如我们想修改UIView的 hitTest:withEvent: 方法,得创建一个UIView的分类,这里我叫ChangeMethod先自己将要实现的方法写好,然后使用Runtime运行时方法 method_exchangeImplementations 交换#import "UIView+ChangeMethod.h"#i原创 2020-08-06 09:37:28 · 211 阅读 · 0 评论 -
iOS 消息机制与三次拯救
文章目录消息机制 objc_msgSend();函数引出执行过程第一阶段 -- 消息发送第二阶段 -- 动态方法解析第三阶段 -- 消息转发Fast fowardingNormal forwarding三次拯救参考文献消息机制 objc_msgSend();函数引出我们写一句OC代码Person *person = [Person alloc];转译为cpp文件就是Person *person = ((Person *(*)(id, SEL))(void *)objc_msgSend)((id原创 2020-08-04 19:52:22 · 407 阅读 · 0 评论 -
NSTimer循环引用分析
文章目录NSTimer介绍循环引用问题创建循环引用处理办法方案一:中间代理对象方案一升级版关于NSProxy类的补充方案二:将timer引用改变方案三:使用Category参考文献NSTimer介绍官方文档经过一定时间间隔后将触发的计时器,会将指定的消息发送到目标对象官方文档中给了三种创建定时器的方法:使用类方法创建计时器,并在默认模式下将其安排在当前运行循环上:scheduledTimerWithTimeInterval:invocation:repeats:scheduledTime原创 2020-08-03 21:15:55 · 769 阅读 · 0 评论 -
RunLoop之线程保活
文章目录为什么需要线程保活线程保活的操作关于run方法的疑问RunLoop的启动方法RunLoop的关闭方法线程保活的分析及代码参考文献为什么需要线程保活在iOS项目中,有时会有一些花费时间较长的操作阻塞主线程,我们通常为了防止界面卡顿,将其放入子线程中运行。根据线程知识,如果子线程执行完分配的任务后,就会自动销毁。比如我们现在定义一个线程,改写它的dealloc方法,观察它什么时候销毁@implementation TAYThread- (void)dealloc { NSLog(@"原创 2020-08-02 00:17:59 · 3042 阅读 · 0 评论 -
RunLoop源码详解
文章目录RunLoop是什么NSRunLoop和CFRunLoopRunLoop内部结构RunLoop源码__CFRunLoop结构体__CFRunLoopMode结构体__CFRunLoopSource结构体CFRunLoopSourceContextCFRunLoopSourceContext1__CFRunLoopTimer结构体__CFRunLoopObserver结构体RunLoop是什么如果没有RunLoop,那么该线程在执行完自己的任务时就会退出;而我们在使用APP时,通常不会只执行完一个原创 2020-07-31 21:21:59 · 796 阅读 · 4 评论 -
Runtime学习之weak原理
文章目录两行代码查看源码_objc_initWeakstoreWeakweak_register_no_lockweak_unregister_no_lockSideTableweak_table_tweak_entry_t参考文献两行代码Person *person = [[Person alloc] init];id __weak a = person;查看汇编得知调用了_objc_initWeak和_objc_destroyWeak函数查看源码_objc_initWeak//loca原创 2020-07-29 09:34:40 · 435 阅读 · 3 评论 -
ARC探究
文章目录问题1概述问题1解答问题2说明问题1概述MRC环境下,[NSMutableArray array]相当于[[[NSMutableArray alloc] init] autorelease],即两者都会加入自动释放池中:但是对于NSArray,两者都不会加入自动释放池:问题1解答经过试验,我发现NSString和NSMutableString的结果也不一样,猜想对于不可变对象,非alloc\new\copy\mutableCopy方法可能不相当于调用了autorelease方法,也许与原创 2020-07-19 22:11:33 · 166 阅读 · 0 评论 -
内存管理之MRCARC
文章目录内存管理(引用计数)自己生成的对象,自己所持有非自己生成的对象,自己也能持有不再需要自己持有的对象就将其释放自己生成并持有的对象非自己生成并持有的对象注意非自己持有的对象无法释放释放两次本就不持有retainCountautorelease使用方法适用场景其他方法showPoolsARC自动引用计数所有权修饰符__strong修饰符__weak修饰符__unsafe_unretained修饰符__autoreleasing修饰符一些规则ARC有效时,不能使用retain或者release遵守命名规则原创 2020-07-14 17:26:37 · 560 阅读 · 0 评论 -
GCD简介
1. 什么是GCDGCD,全称是Grand Central Dispatch,它是C语言的API.GCD的核心 : 将block(任务)添加到queue(队列)中.官方文档的描述:Grand Central Dispatch(GCD)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需定义想执行的任务并追加到适当的Dispatch Queue中,GCD就能生成必要的线程并执行任务,这样就比以前的线程更有效率.2.日常使用 dispatch_queu原创 2020-05-31 23:31:10 · 16917 阅读 · 0 评论 -
iOS 自定义手势
前言最近写的项目有一个手势需求:手势右滑触发已背诵过事件。了解了一下手势的用法代码全局手势.h文件中定义一个全局手势属性@property (nonatomic, strong) UIPanGestureRecognizer *panGestureRecognizer;.m文件:如果使用到这个ViewController的地方都需要它的手势的话,这段代码写在 -(void)viewWillAppear:(BOOL)animated 也可我这个ViewController可以被两个界面调用,原创 2020-05-24 01:58:25 · 743 阅读 · 0 评论 -
协议与分类
文章目录协议通过委托与数据源协议进行对象间通信协议OC语言中有一项特性叫做“协议”,与Java中的“接口”类似。OC不支持多重继承,因而我们把某个类应该实现的一系列方法定义在协议里面。协议最为常见的用途是实现委托模式,当然也有其他用法通过委托与数据源协议进行对象间通信对象之间经常需要互相通信,而通信方式有多种。OC开发者广泛使用一种名叫“委托模式”的编程设计模式来实现对象间的通信。该模式的...原创 2020-05-02 23:58:25 · 481 阅读 · 0 评论 -
iOS NSUserDefaults
前言我们在使用APP时常用的一个功能:用户第一次进入APP时自动进入登录注册界面,提示用户注册登录,用户登录成功后才进入主页,再次进入APP时,不用再次登录就直接进到主页了,就算杀掉该APP进程再次进入,依然进入主页.苹果给我们iOS开发者提供了一个NSUserDefault类,用来持久化存储用户的登录信息,只有卸载APP才能抹掉这些登陆信息.简介NSUserDefaults用来存储 用户...原创 2020-04-28 17:19:01 · 787 阅读 · 0 评论 -
Blocks的实现
文章目录Block的实质__block说明符Block循环引用block的copy/release我们先回顾一下Block类型copy/release在ARC环境下,编译器会自动根据情况将栈上的block复制到堆上,比如以下情况block作为函数返回时在Block中使用附有__strong修饰符的对象类型自动变量block作为CocoaAPI中方法名含有usingBlock的方法参数时block作...原创 2020-04-06 22:35:34 · 315 阅读 · 0 评论 -
iOS 响应者链和事件传递
文章目录iOS事件传递过程响应者链过程示意图代码实现UIResponder 响应者对象UIResponder内部提供的响应和处理事件的方法UITouch介绍主要属性和方法UIEvent介绍主要属性和方法UIView不能接收事件的三种情况参考文献iOS事件触摸事件(touch events)按压事件(press events)摇晃事件(shake - motions events)远程控...原创 2020-04-05 02:25:14 · 363 阅读 · 0 评论 -
ARC简介
文章目录简单介绍引用计数以ARC简化引用计数简单介绍引用计数OC语言使用引用计数来管理内存,也就是说,每个对象都有个可以递增或递减的计数器。如果想使某个对象继续存活的话, 那就递增其引用计数;用完了之后,就递减其引用计数。计数变为0,就表示没人关注此对象了,于是,就可以把它销毁。在对象生命期中,其余对象通过引用来保留或释放此对象。保留与释放操作分别回递增及递减保留计数。以ARC简化引用计数...原创 2020-04-03 01:54:08 · 543 阅读 · 0 评论 -
iOS KVO原理
文章目录举个例子问题KVO底层实现分析证明NSKVONotifying_TPerson类的内部方法验证didChangeValueForKey:内部会调用KVO的实现方法参考文献举个例子@interface TPerson : NSObject@property (assign, nonatomic) int age;@end@implementation TPerson- (vo...原创 2020-02-16 15:42:12 · 271 阅读 · 3 评论 -
iOS 人脸识别
本文主要介绍iOS使用百度AI人脸检测实现简单的人脸年龄和性别检测。文章目录首先在平台里注册账号获取Access Token申请到Access Token后才可以进行人脸数据请求GitHub地址首先在平台里注册账号注册app后拥有API Key和Secret Key获取Access Token请求URL数据格式向授权服务地址https://aip.baidubce.com/oauth...原创 2020-02-03 18:31:55 · 700 阅读 · 0 评论 -
iOS 属性
文章目录属性概念属性特质原子性读/写权限内存管理语义方法名属性概念“属性”是OC的一项特性,用于封装对象中的数据。OC对象通常会把其所需要的数据保存为各种实例变量。实例变量一般通过“存取方法”来访问。其中,“获取方法”(getter)用于读取变量值,而“设置方法”(setter)用于写入变量值。这个概念已经定型,并且经由“属性”这一特性而成为 OC 2.0 的一部分,开发者可以令编译器自动编写...原创 2020-02-01 20:27:56 · 219 阅读 · 0 评论 -
Block
文章目录Block 简介Block结构__block说明符block捕获变量auto:自动static:静态Block 简介将函数及其执行上下文封装起来的对象block的调用实际就是函数的调用Block结构(通过clang编译器,我们可以获得在编译过程中生产的中间代码,看block时如何实现的)在当前目录下找到main.cpp文件,打开后能看到block生成了很多结构体如下:(简化...原创 2019-12-14 23:13:45 · 115 阅读 · 0 评论 -
iOS Category的使用
Category概念官方文档解释:您可以使用类别来定义现有类的其他方法(甚至是您的源代码不可用的类),而无需子类化。通常,您可以使用类别将方法添加到现有类中,例如Cocoa框架中定义的方法。所添加的方法由子类继承,并且在运行时与类的原始方法没有区别。您还可以使用自己的类的类别来:将自己的类的实现分发到单独的源文件中-例如,您可以将一个大类的方法分为几个类别,然后将每个类别放入一个不同的文件...原创 2019-12-08 01:46:49 · 1164 阅读 · 1 评论 -
iOS 数据归档解档
文章目录简介普通数组的归档解档归档解档多个普通对象同时归档解档归档解档自定义对象的归档解档Student.hStudent.m归档解档简介本篇文章使用NSKeyedArchiver和NSKeyedUnarchiver进行iOS的归档解档归档:即将数据写入文件里。一般我们app的数据都是在内存里,只要app关闭,数据就会丢失。但是将数据保存在文件里,就能将数据保存至本地,不管app关闭还是重...原创 2019-12-01 01:35:36 · 1656 阅读 · 0 评论 -
iOS WKWebView简单使用
文章目录WKWebView简单介绍使用方法准备加载网页加载文件界面返回到app代理协议WKWebView简单介绍自iOS8开始,苹果推出了新框架WebKit,提供了替换UIWebView的组件WKWebView,一个用来展示网页的组件。WKWebView解决了UIWebView加载速度慢,占用内存多,优化困难等问题,可以说,WKWebView是目前App内部加载网页的最佳选择。WKWeb...原创 2019-11-24 01:03:39 · 1214 阅读 · 0 评论 -
iOS 完全深复制
文章目录复制简介深复制完全深复制协议方法:使用 initWith***: copyItems:YES 方法归档解档复制简介关于深复制与浅复制的简介:iOS 深复制与浅复制实现完全深复制的方法有两种:协议方法和归档解档归档和解档的概念补充:有时存在这样的需求,即将程序中使用的多个对象及其属性值,以及它们的相互关系保存到文件中,或者发送给另外的进程。为了实现此功能,foundation框架...原创 2019-11-20 20:55:19 · 658 阅读 · 0 评论 -
iOS 使用第三方库提取图片主色值
描述在写项目时我们有时会需要根据点击图片的颜色来改变主题颜色,就需要获取照片主色值,在这里我应用第三方库 SOZOChromoplast 来实现使用步骤首先通过Cocoapods安装在终端处将 pod ‘SOZOChromoplast’ 添加到Podfile中并运行 pod install在使用处写头文件#import <SOZOChromoplast.h>调用的...原创 2019-11-10 01:40:42 · 888 阅读 · 0 评论 -
iOS 深复制与浅复制
文章目录简介代码探索非集合类对象集合类对象单层深复制完全深复制简介浅复制:只改变新对象的指针指向,并未生成新的内存地址,只是将新对象的指针指向要复制对象的内存地址深复制:改变新对象指针指向,还为对象生成新的内存地址。 深复制又分为单层深复制与完全深复制1.单层深复制虽然生成了新的内存地址,但是新的对象中的元素地址还是旧对象元素的地址2.完全深复制不仅内存地址是新的,对象里面的元素地址也...原创 2019-10-27 01:16:18 · 271 阅读 · 0 评论 -
iOS 使用Manager 进行JSON解析数据及model处理
文章目录简介代码及解析Manager的创建数据请求函数使用和Model的配合简介Manager的使用相当于单例,即将需要用到的全局变量和解析数据的方法存入一个类中单例在整个生命周期中只需要创建一次,Manager同理,再考虑到唯一性及线程安全,在这里我们给Manager的创建加锁,若已经存在Manager便不再申请代码及解析Manager的创建dispatch _once可以保证线...原创 2019-10-27 00:16:10 · 342 阅读 · 0 评论 -
iOS 自定义button
自定义button的作用有时候写项目会需要有label和imageView等等很多控件加在一起使用,我之前用很多个UI控件拼接使用,但是总感觉有点low,不够专业,就开始学习自定义button再啰嗦一句:UIButton默认的布局是左侧image,右侧title,如果想要改变image与title的frame,直接设置是不会有效果的。可以通过titleEdgeInsets、imageEdgeI...原创 2019-10-20 00:30:44 · 307 阅读 · 0 评论 -
iOS 中的懒加载
文章目录懒加载简介self.showImageView和_showImageView的区别viewDidLoad正常加载代码懒加载代码懒加载简介懒加载,顾名思义,就是不用它的时候不加载,换句话说,就是只有使用它的时候它才加载,故在某些情况下可以节省空间所谓懒加载,就是推迟它的getter方法的执行。self.showImageView和_showImageView的区别self.sho...原创 2019-10-19 22:46:27 · 151 阅读 · 0 评论 -
iOS聊天室 简单的对话聊天界面(cell自适应高度)
难点因为聊天长度不一样,需要设置自适应高度发送信息后,需要使tableView添加一条cell,并更新cell的所有子视图需要清除,否则会有bug(在最后会附上不清除子视图的效果)键盘弹出界面上移,点击空白处键盘回收,界面下移思路聊天界面的对话其实就是一个tableView,创建一个可变数组记录每句话的高度,根据话语的高度设置单元格高度按发送键时插入一条新cell在最底端,获取...原创 2019-08-09 11:12:36 · 3836 阅读 · 2 评论 -
iOS 自定义cell
思路1.新建TAYTableViewCell 继承自UITableViewCell2.添加需要使用的属性3.写方法新建TAYTableViewCell如图:添加需要的属性以一个label和一个imageView 为例:@interface TAYTableViewCell : UITableViewCell@property (nonatomic, strong) UILab...原创 2019-07-28 02:02:49 · 2093 阅读 · 0 评论 -
iOS 简单的学生管理系统(增删改查)
思路这个简单的学生管理系统学生信息只有姓名,班级,年龄我在app执行时加了个开始界面,在AppDelegate.m 中将根视图设为需要显示的开机界面即可首先写登陆注册界面,注册需要查重,并转到登陆界面时要传值,传值可看我的这篇博客进入app后显示学生信息及要进行的操作,跳转界面即可难点因为学生信息是统一的,执行过程中涉及到很多传值问题,正传反传一定要清楚查找时可以按姓名查找,按...原创 2019-08-09 20:18:23 · 875 阅读 · 1 评论