
iOS开发
文章平均质量分 73
瓜子三百克
励志一起吃瓜
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
iOS开发:Mach-O入门理解
Mach-O:是的缩写,是Mac\iOS上用于存储程序、库的标准格式。属于Mach-O格式的文件类型有:可以在源码中,可以查看到Mach-O格式的详细定义(https://opensource.apple.com/tarballs/xnu/)1、MH_OBJECT2、MH_EXECUTE:可执行文件3、MH_DYLIB:动态库文件4、MH_DYLINKER:动态链接编辑器5、MH_DSYM:存储着二进制文件符号信息的文件.o文件编译生成的流程:官方描述https://developer.apple.c原创 2022-06-27 00:00:00 · 2360 阅读 · 0 评论 -
iOS开发:对于动态库共享缓存(dyld)的了解
苹果官方从iOS3.1开始,为了提高手机性能,就将绝大部分的系统动态库文件都打包存放到了一个缓存文件中(`dyld shared cache`)其缓存文件路径为:`/System/Library/Caches/com.apple.dyld/dyld_shared_cache_armX`**dyld**全称为:dyld shared cache,直接翻译为动态库共享缓存。...原创 2022-06-24 00:00:00 · 3951 阅读 · 10 评论 -
iOS事件传递链与响应链
当我们在手机上点击、滑动等屏幕操作进入到相应的页面,手机是如何区分相应指令并响应的呢?其中又是经历了怎样的过程呢?这里涉及到了事件响应链。文章目录1、事件链2、传递链3、响应链4、示例代码1、事件链如下图所示,用户点击屏幕时,首先UIApplication对象先收到该点击事件,再依次传递给它上面的所有子view,直到传递到最上层,即UIApplication ——> UIWindow ——> RootViewController ——> View ——> Button,即传递链原创 2022-05-29 16:08:24 · 3558 阅读 · 31 评论 -
iOS:关于APP架构设计的简单理解
App架构是软件设计的一个分支,它关心的是如何设计一个 App 的结构。我的理解结构设计分水平和垂直两个方向。垂直方向分:基础层、核心层、业务层、界面层。水平方向可以理解为对界面的的设计模式,目前比较通用的有MVC、MVP、MVVM三种,具体见下图:1、MVC - Apple版是 Cocoa app 中最为常⻅的架构,同时也是在 Cocoa 中讨论架构时所采用的基准线。1、实线部分代表编译期间的引用2、图中的虚线部分代表运行时的引用优点:View、Model可以重复利用,可以独立使用缺点原创 2022-05-25 00:00:00 · 1408 阅读 · 29 评论 -
APP性能优化
APP性能优化分:卡顿处理、耗电处理、安装包瘦身、APP启动四大方面。文章目录1、卡顿处理1.1、卡顿分析1.2、卡顿优化1、CPU 优化2、GPU 优化离屏渲染1、离屏渲染消耗性能的原因2、哪些操作会触发离屏渲染?1.3、卡顿检测2、耗电处理2.1、好点主要来源2.2、耗电优化3、安装包瘦身4、APP的启动4.1、APP启动分类4.2、APP启动时间分析4.2.1、dyld 阶段4.2.2、runtime 阶段4.2.3、main4.3、APP启动优化5、问答拓展1、卡顿处理1.1、卡顿分析APP原创 2022-05-24 00:08:14 · 3474 阅读 · 47 评论 -
APP内存管理
文章目录1、iOS程序的内存布局2、Tagged Pointer 标记指针问答拓展3、定时器3.1、NSTimer、CADisplayLink的使用注意点3.2、GCD定时器封装4、OC对象的内存管理4.1、引用计数的存储4.2、dealloc4.3、自动释放池4.3.1、autorelease 底层结构4.3.2、AutoreleasePoolPage1、链表关系2、实现原理3、触发逻辑5、问答拓展1、iOS程序的内存布局1、代码段:编译之后的代码2、数据段2.1、字符串常量:比如NSStr原创 2022-05-23 00:24:59 · 863 阅读 · 31 评论 -
Runtime系列:常见面试题【08】
讲一下 OC 的消息机制1、OC中的方法调用其实都是转成了objc_msgSend函数的调用,给receiver(方法调用者)发送了一条消息(selector方法名)。2、objc_msgSend底层有3大阶段原创 2022-05-22 00:03:46 · 330 阅读 · 25 评论 -
Runtime系列:LLVM的中间代码(IR)【07】
Objective-C在变为机器代码之前,会被LLVM编译器转换为中间代码(Intermediate Representation)可以使用以下命令行指令生成中间代码:clang -emit-llvm -S main.m常用语法简介:@ - 全局变量% - 局部变量alloca - 在当前执行的函数的堆栈帧中分配内存,当该函数返回到其调用者时,将自动释放内存i32 - 32位4字节的整数align - 对齐load - 读出store - 写入icmp - 两个整数值比较,返回布尔原创 2022-05-21 23:56:34 · 558 阅读 · 38 评论 -
Runtime系列:常用API(附示例)【06】
文章目录1、类2、成员变量3、属性4、方法1、类1、动态创建一个类(参数:父类,类名,额外的内存空间)Class objc_allocateClassPair(Class superclass, const char *name, size_t extraBytes)2、注册一个类(要在类注册之前添加成员变量)void objc_registerClassPair(Class cls) 3、销毁一个类void objc_disposeClassPair(Class cls)4、设置和获原创 2022-05-20 00:03:28 · 823 阅读 · 14 评论 -
Runtime系列:super调用函数本质、isMemberOfClass与isKindOfClass的区别、综合分析【05】
1、实例方法是类的判断: 1、isMemberOfClass:判断左边的实例对象是否等于右边的类 2、isKindOfClass:判断左边的实例对象是否属于右边的类或子类2、类方法是元类的判断: 1、正常情况下传参应该取元类对象进行判断断。 2、如果是传类对象判断,返回全部为0;除非右边入参为 [NSObject class],此时方法调用者不管是哪个类(只要是NSObject体系下的),都返回YES。原创 2022-05-20 00:02:08 · 380 阅读 · 8 评论 -
Runtime系列:消息机制【04】
OC中的方法调用的本质,都是转换为objc_msgSend函数的调用。这里所说的消息机制就是objc_msgSend的执行流程。objc_msgSend的执行流程可以分为3大阶段:1、消息发送1、首先判断消息接收者是否为nil,如果为nil则直接退出。所以存在使用 nil 调用方法,编译的时候也不会报错。2、如果消息接收者不为空,通过isa指针找到消息接收者类对象,然后去查找方法(如果类对象没有找到方法,通过superclass指针找到父类继续查询),具体流程如下图:receiver通过isa指原创 2022-05-19 00:05:05 · 299 阅读 · 21 评论 -
Runtime系列:Class的结构【03】
文章目录1、`bits`类信息1.1、`class_rw_t`结构1.2、`class_ro_t`结构1.3、`method_t`结构1、`IMP`代表函数的具体实现2、`SEL`代表方法\函数名,一般叫做选择器,底层结构跟`char *`类似3、`types`包含了函数返回值、参数编码的字符串2、`cache_t` 方法缓存列表通过isa、superclass指针指向中,我们知道了,isa、superclass的作用,接下来继续详细了探寻下Class结构其他成员变量的作用。Class的底层结构图如下图:原创 2022-05-19 00:03:50 · 514 阅读 · 20 评论 -
iOS的多线程安全隐患与线程同步方案
1、在资源共享时,一块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源,比如多个线程访问同一个对象、同一个变量、同一个文件。2、当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题。原创 2022-05-18 00:40:43 · 1616 阅读 · 37 评论 -
iOS中的多线程与GCD队列关系
文章目录1、iOS中的常见多线程方案2、GCD与队列2.1、常用函数2.2、queue队列2.3、同步、异步、并发、串行2.4、各种队列的执行效果2.5、队列组的使用3、问答拓展1、iOS中的常见多线程方案2、GCD与队列2.1、常用函数GCD中有2个用来执行任务的函数1、用同步的方式执行任务/*** @param: queue:队列* @param: block:任务*/dispatch_sync(dispatch_queue_t queue, dispatch_block_t b.原创 2022-05-18 00:00:00 · 754 阅读 · 20 评论 -
Runtime系列:isa位域详解【02】
要想学习Runtime,首先要了解它底层的一些常用数据结构,比如isa指针:1、在arm64架构之前,isa就是一个普通的指针,存储着Class、Meta-Class对象的内存地址2、从arm64架构开始,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多的信息isa指针共用体(以下均已64架构分析)结构:位域说明:nonpointer:0,代表普通的指针,存储着Class、Meta-Class对象的内存地址1,代表优化过,使用位域存储更多的信息has_a原创 2022-05-17 00:00:11 · 565 阅读 · 2 评论 -
小码哥底层原理之RunLoop
1、概念:顾名思义,RunLoop是一个运行循环,保证App能够持续运行,处理各种事件,节省CPU资源,没事处理的时候就进入休眠。2、RunLoop与线程关系 1、每条线程都有唯一的一个与之对应的RunLoop对象。 2、主线程的RunLoop是默认创建好并开启的,子线程的RunLoop默认是没有的,RunLoop会在第一次获取它时创建,然后手动开启。 3、RunLoop是保存在一个全局的字典里,线程作为Key,RunLoop作为Value。 4、RunLoop会在线程结原创 2022-05-17 00:00:00 · 684 阅读 · 23 评论 -
Runtime系列:位运算在OC中的取值和赋值【01】
本片文章介绍将数据(如:Bool类型的数据)存储到二进制位中,包括实现逻辑、代码示例以及各自的优缺点分析。原创 2022-05-16 01:35:05 · 324 阅读 · 27 评论 -
跟着小码哥一起学习OC语法,都在这里了
1、手把手带你去分析NSObject本质是什么2、用几个示例带你去了解OC对象是怎么分配内存的3、OC的类信息存放在哪里,看完千万别说还不知道4、OC:对象的isa指针和superclass指针分别指向哪里,你知道了吗?5、OC:跟随小码哥一起学习KVO6、OC:跟随小码哥一起学习KVC7、OC:Category的实现原理8、OC:一步步带你如何给Category对象添加成员变量block系列:9、OC:关于block的本质,你懂了吗?10、一篇就带你读懂关于block的变量捕获(ca原创 2022-05-15 00:07:04 · 669 阅读 · 39 评论 -
Clang编译OC程序的常用命令
在Objective-C开发过程中,尤其在了解某些功能的底层实现时,常用到Clang编译器的命令。这篇文章是简单了解Clang和Clang的常用指令。原创 2022-05-15 00:04:34 · 2410 阅读 · 50 评论 -
你知道block循环引用怎么解决了吗?
✅作者简介:大家好我是瓜子三百克,一个非科班出身的技术程序员,还是喜欢在学习和开发中记录笔记的小白博主!📃个人主页:瓜子三百克的主页🔥系列专栏:OC语法🤟格言:作为一个程序员都应该认识到,好的代码是初级工程师都可以理解的代码, 伟大的代码是可以被学习一年计算机专业的新生所理解。💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞在使用block的时候,最需要注意的问题便是循环引用,这节主要讲解,block是如何产生的?碰到循环引用又该怎么解决。文章目录一、循环引用的..原创 2022-05-10 08:00:00 · 832 阅读 · 36 评论 -
一顿饭的功夫带你了解block是如何内存管理的
2.1、不需要内存管理的情况:>1、**当block在栈上**:block内部不会对__block变量产生强引用,所以不需要内存管理2、**基本数据类型,没有加 __block 修饰符的**:block内部是值存储,不涉及对象管理,所以不需要内存管理。3、**static变量和全局变量**:内存放在数据段,由程序统一管理,可全局访问,长期持有而且不会销毁,所以不需要内存管理。2.2、需要进行内存管理的情况:原创 2022-05-09 07:00:00 · 1386 阅读 · 31 评论 -
block修改变量,有哪些方式你知道了吗?
1、__block可以用于解决block内部无法修改auto变量值的问题2、__block不能修饰全局变量、静态变量(static)3、编译器会将__block变量包装成一个对象原创 2022-05-08 17:04:08 · 1264 阅读 · 19 评论 -
block与copy关系的恩怨情仇,你就不想知道吗?
我们知道了不同类型的block调用copy后的结果。那么你是否知道以下情形:一、哪些情况block自动copy到堆上?二、堆栈上的block对auto变量的引用是什么关系?原创 2022-05-08 14:05:58 · 1085 阅读 · 40 评论 -
block有哪些对象类型,你知道了吗?
从block的本质这篇文章中,我们已经知道block的本质是一个OC对象。既然是OC对象。那肯定有对象类型,还是从block的本质这篇文章中搜索impl.ipa字段,发现block指向了一个对象 _NSConcreteStackBlock。那么block还有什么类型呢?怎么实现呢?它们又是分配在哪些内存区呢?让我们带着这些疑问往下看。原创 2022-05-08 08:00:00 · 814 阅读 · 22 评论 -
一篇就带你读懂关于block的变量捕获(capture)
上面一节讲解了block的本质,举例了block最简单结构的一种情况。如果更复杂了呢。比如block函数执行调用外部参数,会有哪些情况呢?不同的情况,他们又有什么异同点呢?这里先把分析结果写在最前面,不懂的可以先跳过,看下面的正文每一个情形有底层结构分析。如果能看明白的,可以不看下面的正文,说明你已经很清楚 block 变量捕获机制了:1、block变量捕获机制(capture)1、捕获(capture):是指在 block 内部会专门新增一个成员变量,来存储传进来的值。或者说将外面的值捕获到 bl原创 2022-05-07 22:21:42 · 2338 阅读 · 28 评论 -
关于block的本质,你懂了吗?
block应用的目的: 把将来想要执行的代码封装起来,然后在恰当的时刻再执行代码。block本质:1、block是封装了函数调用和函数调用环境()的OC对象。2、block本质上也是一个OC对象,它内部也有一个isa指针(只要内部有一个isa指针,我们就可以认为他是OC对象,因为NSObject作为最基础的OC对象,第一个成员变量就是isa指针,这是OC对象的特征)。原创 2022-05-05 00:00:00 · 1719 阅读 · 18 评论 -
OC:跟随码哥一起学习KVO
本篇行文带你全面了解什么是KVO、KVO的代码实现、KVO的原理、KVO的底层逻辑,已经常见问题解答。原创 2022-05-02 22:52:24 · 865 阅读 · 34 评论 -
OC:在分类中添加成员变量,原来帮我们做了那么多事
本篇文章告诉你,如果在类对象和Category对象中添加一个属性时,底层做了什么。关联对象如何给Category对象添加成员变量,关联对象的实现原理。原创 2022-05-05 00:00:00 · 1475 阅读 · 34 评论 -
OC:关于Category、load、initialize的那些事你还记得吗?
这篇文章主要分析Category的实现原理,load方法和initialize方法调用方式、调用时机、调用顺序、以及他们的区别,解释 Catgory 与 class Extension 有什么区别。原创 2022-05-03 16:37:46 · 1149 阅读 · 14 评论 -
OC:跟随小码哥一起学习KVC
KVC 全拼 key-value-coding,翻译过来即为 键值编码 。可以直接访问对象的属性,或者给对象的属性赋值。黑魔法之一,很多高级的iOS开发技巧都是基于KVC实现的。原创 2022-05-04 00:00:00 · 1754 阅读 · 40 评论 -
OC:对象的isa指针和superclass指针分别指向哪里,你知道了吗?
**1、OC对象的 isa 指针指向哪里?**>1、instance对象的isa指向class对象。2、class对象的isa指向meta-class对象。3、meta-class对象的isa指向基类的meta-class对象。原创 2022-05-03 00:00:00 · 1370 阅读 · 44 评论 -
OC的类信息存放在哪里,看完千万别说还不知道
OC的类信息存放在哪里?1、对象方法、属性、成员变量、协议信息,存放在class对象中。2、类方法,存放在meta-class对象中。3、成员变量的具体值,存放在instance对象。原创 2022-05-02 10:27:00 · 715 阅读 · 16 评论 -
几个示例带你去了解OC对象是怎么分配内存的
前面已经讲解了,NSObject 的本质,现在采用更复杂的进行举例分析内存分配规则原创 2022-05-01 16:56:12 · 1223 阅读 · 18 评论 -
手把手带你去分析NSObject本质是什么
这篇行文主要讲 NSObject 对象三连问:NSObject本质是什么,占用多少内存,以及怎么去分析。原创 2022-05-01 16:54:12 · 1899 阅读 · 10 评论 -
关于敏捷开发的思考
敏捷开发缺点:1、文档。相对于传统开发模式来说,敏捷开发不重视文档,项目前期还好,大家的沟通内容都还记得住,随着项目逐渐深入,讨论内容越来越多,就会开始出现混乱。每个人对需求都开始产生了自己的理解,有很多需求和设计是自相矛盾的。因为没有必要的文档和记录,项目后期常常会因为需求问题吵架。2、沟通。因为敏捷倡导面对面沟通,所以要求每个人都要有很好的理解能力和表达能力,这点对于程序员来说是非常困难的。实际工作中,真的能听懂别人、并把话说清楚的人不多。3、个人能力。敏捷开发要求个人能力很强,因为团队规模小、原创 2022-02-12 17:30:24 · 722 阅读 · 0 评论 -
Xcode可以清理哪些缓存?
目录一、手动清理缓存二:软件清理缓存三、延伸作为一个使用Mac电脑做软件开发的程序猿,在项目开发中,当内存不足的时候,时不时的会报警内存不足。是否有清理缓存的冲动?但是mac系统中的软件基本是没有清除各自项目中产生的垃圾缓存或可要可不要缓存的功能,感觉好low。那么又当如何处理?软件卸载重新安装?其实,只要我们细心观察,我们就能找到哪些软件占用我们的内存时最大的,就比如我的:xcode刚下载下来的时候,也就十几个G,现在有一百多个G,逆天了简直!!!只要能清除其中不需要的,或者可要可不要的,内存差不多就可原创 2021-10-03 14:39:08 · 15199 阅读 · 0 评论 -
iOS 音视频编解码基本常识与开发
目录一、内容元素二、基础概念2.1、视频封装格式2.2、视频的编码格式2.2.1、视频编解码的主要影响因数1)视频质量2)视频码率3)算法复杂度4)鲁棒性2.2.2、常见的编码方式1)H.26X 系列2)MPEG 系列2.3、音频编码方式2.3.1、AAC:Advanced Audio Coding2.3.2、MP3:MPEG-1 or MPEG-2 Audio Layer III2.3.3、WMA:Windows Media Audio三、直播/小视频中的编码格式3.1、视频编码格式3.2、音频编码格式:原创 2021-09-09 16:37:10 · 4374 阅读 · 0 评论 -
什么是C++编程的构造函数与析构函数
【attribute】可用于为函数或者数据声明赋属性值。给函数分配属性的主要目的是为了让编译程序可以优化处理。分配给函数的属性位于函数原型的声明中。原创 2021-09-06 14:00:10 · 188 阅读 · 0 评论 -
SourceTree 一直提示输入密码问题
项目是走ssh克隆下来的,之前也配置过密钥。按理来说不应该出现这样的问题,在日常开发过程中突然需要我输入密码?原创 2021-09-06 10:52:47 · 3898 阅读 · 2 评论 -
iOS:项目中无用类检测和无用图片检测汇总
在涉及到项目大改版,或者涉及到某个功能模块大变更,就会涉及到图片废弃和文件废弃的情况。但是这时候就会遗留下一个很大的问题,没有将废弃的、无用的文件类或资源删除干净。而这次需要对工程代码的无用资源和无用文件进行删除处理,感触颇多,故在此笔记。原创 2021-08-30 17:14:51 · 7015 阅读 · 0 评论