![](https://img-blog.csdnimg.cn/74b77a7595da4d388e56ea089dc1467e.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
iOS
文章平均质量分 79
Objective-C
HumorousGhost
iOS开发
展开
-
iOS 提取图片中的文字
Vision原创 2022-11-02 11:07:12 · 1739 阅读 · 1 评论 -
iOS 创建PDF文件
PDF 创建,PDFKit ,UIGraphicsPDFRendererFormat原创 2022-10-27 16:31:06 · 1486 阅读 · 0 评论 -
iOS ☞ SDWebimage 内存暴增问题
SDWebImage 底层逻辑,以及使用SDWebImage而引发的内存暴增问题原创 2022-08-04 17:15:20 · 2123 阅读 · 0 评论 -
iOS 15 适配总结
Xcode 13.0 编译问题一些老项目使用的编译方式是 Legacy Build System (Deprecated)。这个方式在 Xcode 13.0中会报编译错误。: The Legacy Build System will be removed in a future release. You can configure the selected build system and this deprecation message in File > Workspace Settings.原创 2021-10-18 16:29:41 · 2611 阅读 · 0 评论 -
iOS 底层探索(二十八) RunLoop
iOS 底层探索(二十八) RunLoopRunLoop概述RunLoop的定义RunLoop说白了就是一个do...While循环RunLoop的作用保持程序的持续运行处理App中的各种事件(触摸、定时器、performSelector)节省CPU资源、提供程序的性能:该做事就做事,该休息就休息jRunLoop的经典图RunLoop的itemblock应用:CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK调用timer:CFRUNLOOP_IS_CALL原创 2020-11-27 16:05:19 · 286 阅读 · 0 评论 -
iOS 底层探索(二十七) 内存管理
iOS 底层探索(二十七) 内存管理(上)内存管理内存布局内存管理方案ARC & MRC引用计数弱引用自动释放池内存布局上方的内存位置,从0xc0000000使用,是因为在4GB内存中,有1GB为内核使用,即系统使用,栈区:函数,方法,一般为0x7开头堆区:通过alloc分配的对象,blockcopy,一般为0x6开头BBS段:未初始化的全局变量,静态变量,一般为0x1开头数据段:初始化的全局变量,静态变量,一般为0x1开头text:程序代码,加载到内存中内存原创 2020-11-25 16:29:57 · 272 阅读 · 0 评论 -
iOS 底层探索(二十六) 启动优化☞二进制重排
iOS 底层探索(二十六) 启动优化☞二进制重排在iOS 底层探索(二十五)启动优化方案中我们得知,二进制重排是有效优化启动时间的操作,但是这个方案需要对所有启动所需的方法进行二进制重排,即自己编辑order_file文件。那么就有一下几个点完全自己手写,并且对自己的项目特别熟,还要随时与其他开发人员交流。找到一种自动生成文件的方案。SanitizerCoverage查看SanitizerCoverage网站,查看Tracing PCs with guards内容,根据其内容修改TestDem原创 2020-11-23 17:09:33 · 360 阅读 · 0 评论 -
iOS 底层探索(二十五) 启动优化☞方案探讨
iOS 底层探索(二十五) 启动优化冷启动:在内存中不包含相关的数据,由系统决定热启动:在杀掉应用后,内存数据依然在测试App启动,用main函数做分界点,main函数之前叫pre-main,main函数之前的时间是系统决定的,启动时间不能统计,main函数之后的启动时间是可以启动的。由于在main之后的操作在每个App都会有所不同。配置系统启动时间打印在Arguments中添加DYLD_PRINT_STATISTICS选项运行查看结果因为当前项目是个空项目,没有参考性,因此我们需要借助一原创 2020-11-20 17:24:52 · 302 阅读 · 2 评论 -
iOS 底层探索(二十四)Clang插件
iOS 底层探索(二十四)Clang插件在LLVM文章中编译了llvm创建插件在/clang/tools目录下新建插件CustomPlugin文件夹修改/clang/tools目录下的CMakeLists.txt文件,新增add_clang_subdirectory(CustomPlugin).在CustomPlugin目录下新建一个名为CustomPlugin.cpp的文件和CMakeLists.txt的文件。在CMakeLists.txt中写上如下代码add_llvm_lib原创 2020-11-17 16:41:40 · 433 阅读 · 0 评论 -
iOS 底层探索(二十三) LLVM
iOS 底层探索(二十三) LLVM (上)什么是编译器Python解释器创建helloWorld.py的文件,内容如下print("hello\n")然后使用命令行进行运行其中python命令的意义是python语言的解释器。因为它可以直接运行处结果。C语言编译器创建helloWorld.c文件,代码内容如下:#include <stdio.h>int main(int a, char *argv[]){ printf("hello \n"); return 0原创 2020-11-16 16:51:16 · 486 阅读 · 0 评论 -
iOS底层探索(二十二)Block
iOS底层探索(二十二)BlockBlock相信都会用到,他是回传数据的一种方法,并且它本身是一个函数,只不过没有名字Block的三种类型自定义代码,如下 void (^block)(void) = ^{ NSLog(@"Name"); }; NSLog(@"%@",block);这么一个简单的Block就写完了。运行一下。查看当前Block的类型为NSGlobalBlock类型。这是Block的其中一种类型,为全局类型。当在Block访问外部变量时,原创 2020-11-13 11:03:26 · 219 阅读 · 0 评论 -
iOS底层探索(二十一)锁(下)
iOS底层探索(二十一)锁(下)接iOS底层探索(二十二)锁(上),NSLock自定义NSLock代码,如下:NSLock *lock = [[NSLock alloc] init];[lock lock];[lock unlock];查看lock与unlock方法。@protocol NSLocking- (void)lock;- (void)unlock;@end@interface NSLock : NSObject <NSLocking> {@priva原创 2020-11-12 10:55:07 · 190 阅读 · 0 评论 -
iOS底层探索(二十)锁(上)
iOS底层探索(二十)锁(上)在iOS底层探索(十九)GCD(下)我们查看了关于GCD的相关内容,我们先来进行GCD的补充。dispatch_group_t最直接的作用:控制任务执行顺序dispatch_group_create 创建组dispatch_group_async 进组任务dispatch_group_notify 进组任务执行完毕通知dispatch_group_wait 进组任务执行等待时间dispatch_group_enter 进组dispatch_group原创 2020-11-11 15:43:17 · 467 阅读 · 1 评论 -
iOS底层探索(十九)多线程(下)GCD
iOS底层探索(十九)多线程(下)GCD在iOS底层探索(十八)多线程(中)中了解了任务的包装和调用流程,现在继续dispatch_async断点堆栈查看源码,如下:voiddispatch_async(dispatch_queue_t dq, dispatch_block_t work){ dispatch_continuation_t dc = _dispatch_continuation_alloc(); uintptr_t dc_flags = DC_FLAG_CONSUME;原创 2020-11-06 17:20:20 · 580 阅读 · 0 评论 -
iOS底层探索(十八) 多线程(中)GCD(上)
iOS底层探索(十八) 多线程(中)GCDGCD简介什么是GCD?将任务添加到队列,并且指定执行任务的函数全称是 Grand Central Dispatch纯C语言,提供了非常多强大的函数GCD的优势GCD是苹果公司为多核的并行运算提出的解决方案GCD会自动利用更多的CPU内核(比如双核、四核)GCD会自动管理线程的生命周期(创建线程、调度任务、销毁线程)程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码。函数任务使用block封装任务的block没有参数也原创 2020-11-03 15:24:04 · 520 阅读 · 1 评论 -
iOS底层探索(十七) 多线程(上)
iOS底层探索(十七) 多线程(上)概念线程和进程的定义线程线程是进程的基本执行单元,一个进程的所有任务都在线程中执行进程想要执行任务,必须得有线程,进程至少要有一条线程程序启动会默认开启一条线程,这条线程被称为主线程或UI线程进程进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存空间内通过“活动监视器”可以查看Mac系统中所开启的进程进程与线程的关系**地址空间:**同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址原创 2020-11-02 16:03:19 · 205 阅读 · 0 评论 -
iOS底层探索(十六) KVO
iOS底层探索(十六) KVO上一篇iOS底层探索(十五) KVC我们讲述了KVC的官方文档,从KVC的文档中引出KVO文档因为有了KVO,才让OC有了响应式编程方式定义KVO定义3个ViewController,第一个页面只负责跳转,第二个页面进行对象的监听,第三个页面中也不做处理第二个ViewController中的代码如下:- (void)viewDidLoad { [super viewDidLoad]; self.person = [LGPerson new];原创 2020-10-27 17:20:57 · 175 阅读 · 0 评论 -
iOS底层探索(十五) KVC
iOS底层探索(十五) KVCKey-Value Coding(KVC),存在于NSObject(NSKeyValueCoding)的分类中普通赋值[person setValue:@"KC" forKey:@"name"];赋值并修改数组person.array = @[@"1",@"2",@"3"]; // 修改数组 // person.array[0] = @"100"; // 第一种:搞一个新的数组 - KVC 赋值就OK NSArray *arr原创 2020-10-26 14:25:52 · 211 阅读 · 0 评论 -
iOS底层探索(十四) 面试题
iOS底层探索(十四) 面试题设置了关联对象是否需要释放设置关联对象,不需要进行释放。查看dealloc方法。- (void)dealloc { _objc_rootDealloc(self);}查看_objc_rootDealloc方法void_objc_rootDealloc(id obj){ ASSERT(obj); obj->rootDealloc();}查看rootDealloc方法。inline voidobjc_object::ro原创 2020-10-23 16:50:31 · 286 阅读 · 0 评论 -
iOS底层探索(十三) 类的加载(下)
iOS底层探索(十三) 类的加载(下)在上一篇文章iOS底层探索(十二) 类的加载(中)中了解到分类的加载,今天继续探索。类的地址内容给readClass添加断点,并运行到断点。打印cls内容以及地址内容。根据内存打印内容可知,根据类的结构,鼠标选中的位置应该是bits的内容,但是为什么这个地方为0呢,因为类中是有内容的。bits的内容什么时候存在。为0时是否为空我们继续断点进行查看。进入realizeClassWithoutSwift方法,如下图:从上图可以看出。我使用了cls来获取原创 2020-10-21 15:29:58 · 381 阅读 · 0 评论 -
iOS底层探索汇总
alloc 探索内存对齐机制理解isa详解isa详解(续)类的底层解析属性与方法cache_t 分析objc_msgSend方法☞快速查找objc_msgSend方法☞慢速查找应用程序加载类的加载(上)类的加载(中)原创 2020-10-16 16:23:26 · 376 阅读 · 0 评论 -
iOS底层探索(十二)类的加载(中)
iOS底层探索(十二)类的加载(中)书接上文,在iOS底层探索(十一) 类的加载(上)中,我们了解到在realizeClassWithoutSwift方法中进行了类的加载,我们继续研究这个方法。realizeClassWithoutSwift方法探究源码如下:static Class realizeClassWithoutSwift(Class cls, Class previously){ runtimeLock.assertLocked(); class_rw_t *rw;原创 2020-10-16 16:05:25 · 514 阅读 · 0 评论 -
iOS底层探索(十一)类的加载(上)
iOS底层探索(十一)类的加载通过上一篇文章iOS底层探索(十) 应用程序加载我们可以了解到应用程序加载的过程,那么类的加载是在什么时候进行的呢?通过上一篇文章我们了解到dyld加载镜像文件时是通过(*sNotifyObjCInit)(image->getRealPath(), image->machHeader());方法获取镜像文件的真实地址的。那么sNotifyObjCInit指针地址又是什么时候传进来的呢?通过搜索发现sNotifyObjCInit是在registerObjCNo原创 2020-10-14 16:48:29 · 555 阅读 · 1 评论 -
iOS底层探索(十) 应用程序加载
应用程序加载load C++ main 加载顺序在了解应用程序加载顺序之前,我们需要先了解一下runtime中比较常用的方法load以及C++方法、main函数的执行顺序在ViewController.m文件中添加load方法,并在方法中打断点+ (void)load { NSLog(@"%s",__func__);}在main.m文件中增加C++方法,并且在方法中打断点__attribute__((constructor)) void kcFunc() { prin原创 2020-09-28 14:31:40 · 984 阅读 · 0 评论 -
iOS 开发者必知
App Store 审核指南 : https://developer.apple.com/cn/app-store/review/guidelines/原创 2020-09-25 10:18:35 · 148 阅读 · 0 评论 -
iOS底层探索(九) objc_msgSend 方法☞慢速查找流程分析
runtime 方法慢速查找分析原创 2020-09-23 15:11:16 · 417 阅读 · 0 评论 -
iOS底层探索(八) objc_msgSend方法☞快速查找
Objective-C runtime在了解objc_msgSend时。我们需要先了解Objective-C的runtime机制runtime简介在了解runtime之前,先区分个概念编译时与运行时。编译时:顾名思义,就是正在编译的时候,编译器帮你把源代码翻译成机器能识别的代码。(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言)。在这个过程中,编译器不关心你的具体流程,只关心你是否有语义或语句上的错误。运行时:就是代码跑起来了,已经被装载到内存中调用了。(在应用没有运行时,你的原创 2020-09-22 16:39:45 · 476 阅读 · 0 评论 -
iOS底层探索(七) cache_t 分析
cache_t 分析原创 2020-09-20 12:18:05 · 305 阅读 · 0 评论 -
iOS底层探索(六) 属性与方法
方法调用顺序原创 2020-09-19 16:42:46 · 188 阅读 · 0 评论 -
iOS底层探索(五) 类的底层解析
位域在内存中,对象的存储类似于数组结构,需要根据对应的大小进行一定的偏移,然后获取到当前数据示例获取0内存,直接读取;获取1内存时,则需要将0内存首地址进行偏移,偏移读为0内存的大小。...原创 2020-09-13 20:12:02 · 237 阅读 · 0 评论 -
iOS底层探索(四) isa详解(续)
对象的本质原创 2020-09-12 15:54:05 · 414 阅读 · 0 评论 -
iOS底层探索(三) isa详解
isa内存原创 2020-09-10 21:31:02 · 595 阅读 · 0 评论 -
iOS底层探索(二) 内存对齐机制理解
内存在iOS的面向对象的开发中,一定会使用对象,也自然而然的使用到内存,因为对象本身就是创建在内存上的,不管你是在堆区、栈区、全局区、静态区等等,接下来就来分析一下具体对象或结构体在内存中是怎么创建内存地址的,以及会创建多大的空间。对象的本质struct objc_class { Class _Nonnull isa OBJC_ISA_AVAILABILITY;#if !__OBJC2__ Class _Nullable super_class原创 2020-09-08 15:17:12 · 252 阅读 · 0 评论 -
iOS App上架审核经验
上架梳理好久没有写博客了,外包公司就是比较忙,没办法在第一时间整理并写出博客,如今离职,我将慢慢梳理这几年的工作经验,先从上架开始梳理带有微信支付与支付宝支付的App商城类App是有实物交易的,比如某宝、某东等,还有就是有某种服务的,如外卖、维修等,如某团。在这几类App中一定会用到两个框架,WXApi与AliPaySDK,这两个框架苹果审查委员会会严查,尤其是AliPaySDK,因为这是专门进行支付的框架,而WXApi还有微信登录与分享的功能,并不会严查这个框架,也就是说你也可以进行仅支持微信支付原创 2020-09-05 21:39:11 · 1941 阅读 · 0 评论 -
iOS底层探索(一) alloc 探索
alloc 初探原创 2020-09-05 19:34:30 · 342 阅读 · 0 评论 -
iOS 13、Xcode 11.3 系统适配问题
使用Xcode 11.3创建项目时会发现多了两个文件,SceneDelegate.h和SceneDelegate.m,这是做什么用的呢,原来在iOS 13之后,iPad的应用可以支持在Mac上进行安装,从而引申出“场景”这个框架,即应用可以切换多个页面(场景)同时显示,而不仅限于之前的一个(UIWindow)未完待续。。。...原创 2020-04-22 11:34:31 · 1365 阅读 · 0 评论 -
Podfile 文件模板
platform :ios, '9.0' #最低适配版本source 'https://github.com/CocoaPods/Specs.git' #重定向cocoaPodstarget 'Demo' do #项目名 pod 'AFNetworking', '3.2.1'end原创 2019-11-05 18:25:59 · 393 阅读 · 0 评论 -
自身项目iOS 13 适配
1. 修改状态栏背景色iOS 13之后,苹果禁止KVC方式直接修改私有属性,解决办法为:UIView *statusBar;if (@available(iOS 13.0, *)) { statusBar = [[UIView alloc] initWithFrame:[UIApplication sharedApplication].keyWindow.windowScene.s...原创 2019-11-05 18:07:03 · 235 阅读 · 0 评论 -
ld: symbol(s) not found for architecture i386 一般解决办法
类似这种错误,一般是库的问题,一般解决办法如下:1. 检查工程设置Search Paths里的Framework Search Paths、Header Search Paths、Library Search Paths的路径设置,看设置路径是否正确,另外还要注意里边是否多余一些不确定的路径。2. 注意检查是否将库添加进工程里,添加的库分为模拟器、真机和混合版的3. 注意检查库跟前台的...原创 2019-11-05 17:54:07 · 2621 阅读 · 0 评论 -
Xcode Error:Multiple commands produce
最近使用Xcode 11版本的时候,在编译项目时失败,报错内容:Undefined symbol: _OBJC_CLASS_$_WBMessageObject因为我植入了微博的SDK,又使用pod更新了版本,就出现了这个问题解决方式:1. 修改build system ---- 最快速有效的解决方法在Xcode菜单栏->file -> Workspace Setti...原创 2019-11-05 17:48:10 · 765 阅读 · 0 评论