iOS进阶
文章平均质量分 85
_uDoctor
58同城招聘大前端/后端/测试,有兴趣的同学联系我,可以内推哦!
展开
-
iOS:沙盒之 Documents、Library、tmp、SystemData
iOS APP都有一个存储空间,就是沙盒。APP的沙盒不能相互访问。沙盒根目录结构:Documents、Library、temp、SystemData可通过一下代码查看NSLog(@"path=[%@]",NSHomeDirectory());1:DocumentsDocuments文件夹下面的内容会默认备份到iCloud,通过Wi-Fi每天自动备份。所以不能放大文件(审核的时候可能会被拒)。2:Librarya:CachesiTunes或iCloud不会对其进行备份。如果存储空间过低,原创 2020-09-08 17:46:31 · 1121 阅读 · 0 评论 -
iOS:App 签名的原理
为什么要签名?先来看看苹果的签名机制是为了做什么。在 iOS 出来之前,在主流操作系统(Mac/Windows/Linux)上开发和运行软件是不需要签名的,软件随便从哪里下载都能运行,导致平台对第三方软件难以控制,盗版流行。苹果希望解决这样的问题,在 iOS 平台对第三方 APP 有绝对的控制权,一定要保证每一个安装到 iOS 上的 APP 都是经过苹果官方允许的,怎样保证呢?就是通过签名机制。数字签名的作用是我对某一份数据打个标记,表示我认可了这份数据(签了个名),然后我发送给其他人,其他人可以知道这原创 2020-09-08 15:26:13 · 256 阅读 · 0 评论 -
iOS:IDFV和IDFA
一、 UDID(Unique Device Identifier Description)代码貌似取不到了,只能通过iTunes获取了,证书添加设备号就是这个二、IDFA (Identifier For Advertising)在同一个设备上的所有App都会取到相同的值,是专门给各广告提供商用来追踪用户而设的 NSString *IDFA = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];原创 2020-09-01 14:54:09 · 5301 阅读 · 0 评论 -
iOS:NSOperation基本使用
NSOperationiOS4推出GCD后,NSOPeration和NSOperationQueue是基于GCD更高一层的封装。所以NSOperation完全地面向对象。比GCD更简单易用、代码可读性也更高。NSOperation和NSOperationQueue分别对应GCD的任务和队列,NSOperation对比GCD会带来一点额外的系统开销,但是Operation操作性更好NSOperation作为一个基类,不能直接创建任务,需要通过他的子类NSInvocationOperation、NSB原创 2020-08-24 15:01:33 · 1187 阅读 · 0 评论 -
iOS:反射机制与kvc
一、kvckvc键值编码:通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。iOS开发中的黑魔法之一。 Animal *cat= [[Animal alloc] init]; [cat setValue:@"tom" forKey:@"name"];当调用[cat setValue:@"tom" forKey:@"name"];时,底层的执行机制如下:程序优先调用setName:属性原创 2020-08-20 16:22:46 · 546 阅读 · 0 评论 -
iOS:组件化之Target-Action模式
传统模式的弊端传统模式的组件之间的交互都是#import "HomeVC.h",然后在该页面push或者present,项目小没有问题。但是当项目越来越大,就会发现:模块间相互依赖,耦合严重管理起来很混乱如下图:任何一个模块变动,导致其他依赖该模块的地方需要检查是否要随着变动。那么按照解耦的思想,改成如下这种中心化的方式就会清晰明了但是依然有问题。虽然看起来比刚开始清晰了很多,但是每个组件还是和中间层双向依赖双向依赖:如果首页或者登陆改变,导致依赖这两个模块的中间层可能也需要改原创 2020-08-18 17:11:55 · 1735 阅读 · 0 评论 -
iOS:网络优化
iOS网络优化主要解决两点:服务器压力客户端网络优化、增加用户体验优化的方向主要是:NSURLCache缓存、Last-Modified、ETagDNS解析数据压缩:protobuf,WebPTCP对头阻塞一、NSURLCache缓存和Last-Modified、ETagNSURLCache可以完成大部分的缓存需求,NSURLCache使用前提只能作用于get请求设置NSURLCache:默认512kb的内存缓存空间,以及10MB的磁盘缓存空间 NSURLCache原创 2020-08-07 18:33:49 · 841 阅读 · 0 评论 -
iOS :NSMutableArray和NSDictionary、NSSet底层原理、NSCache、copy/mutableCopy
一、NSMutableArray底层原理普通c数组,就是一段能被方便读写的连续内存控件。使用一段线性内存空间的一个最明显的缺点是,在下标 0 处插入一个元素时,需要移动其它所有的元素,同样地,假如想要保持相同的内存指针作为首个元素的地址,移除第一个元素需要进行相同的动作NSMutableArray本质是一个对象。它采用了环形缓冲区的结构。在两端插入和删除非常的快。插入头尾只是修改offset指针,如果插入数据到达阀值,一样需要扩容。只有中间插入和删除时,才需要移动较少的内容...原创 2020-08-07 11:22:20 · 1418 阅读 · 1 评论 -
iOS:内存优化思路
内存问题主要包括两个部分常见循环引用导致的内存泄露大量数据加载及使用导致的内存警告内存优化也是注意处理这两个部分1、循环引用循环引用对App有潜在的危害,会使内存消耗过高,性能变差和Crash等,主要从以下几个方面入手Delegate代理要声明为weak,不能用strong。NSTimerRunLoop会强引用target,可以使用weakProxy 消息转发。使用GCD timerBlock_weak 修饰对象C语法,malloc之后调用free二、大量数据加载导致内存暴原创 2020-08-06 17:57:28 · 454 阅读 · 0 评论 -
ios:Layer 异步绘制
1:layoutSubviews调用时机init不会触发layoutSubviews调用addSubview会触发layoutSubviewsUIView的Frame改变时(frame的值设置前后发生了变化),会触发layoutSubviewsUIScrollView滚动时,UIView的重新布局会触发layoutSubviews直接调用setNeedsLayout 或者layoutIfNeededUILable,UIImageView等有内容物的View,调用sizeToFit方法后,siz原创 2020-07-31 15:58:02 · 569 阅读 · 0 评论 -
iOS :runtime之关联对象
大家好,我是OB!当我们利用runtime给分类动态添加属性,本质不是给这个对象添加成员变量,而是为这个对象创建一个关联对象,所以在我们objc_setAssociatedObject添加关联对象后,利用runtime的copyIvarList 是可以发现,根本没有创建新的成员变量的。- (void)setName:(NSString *)name { objc_setAssociatedObject(self, "key_name", name, OBJC_ASSOCIATION_COPY_N原创 2020-07-30 11:23:31 · 250 阅读 · 0 评论 -
Instruments 中 Core Animation优化(二)
1-Color Blended Layers (图层混合) 这个选项是检测哪里发生了图层混合,先介绍一下什么是图层混合?很多情况下,界面都是会出现多个UI控件叠加的情况,如果有透明或者半透明的控件,那么GPU会去计算这些这些layer最终的显示的颜色,也就是我们肉眼所看到的效果。例如一个上层Veiw颜色是绿色RGB(0,255,0),下层又放了一个View颜色是红色RGB(0,0,255),透明原创 2017-10-12 16:39:52 · 606 阅读 · 0 评论 -
iOS:响应链和事件传递&图片的解压缩及渲染过程
iOS 响应链和事件传递当我们点击了屏幕发生了什么?两件事,第一找到点击的view(事件传递),第二响应对应的事件(响应链)。一、事件传递发生触摸事件后,系统会将事件加入到UIApplication管理的一个任务队列(比如滑动事件就是多个UIEvent事件,放入一个队列中,取出队列的头部事件进行处理)中,UIApplication将事件传递给UIWindow继续向下分发给UIView。UIView首先做hitTest检测 触摸点是否在自己身上。如果不在,那么继续寻找子视图。以下代码就是hit原创 2020-07-23 14:45:31 · 239 阅读 · 0 评论 -
iOS:APP启动过程及优化方案
大家好!我是OB!正文开始前,先说说有的没的!一、静态库和动态库静态库动态库格式.a 和 .framework(Mach-O Type为 Static Library).tbd(以前是.dylib) 和 .framework(Mach-O Type为 Dynamic Library)链接时被完整的复制到可执行文件中,多次使用就会多份拷贝不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内存。优原创 2020-07-22 17:58:19 · 1272 阅读 · 0 评论 -
iOS:对象的alloc&init、ARC中dealloc使用
大家好,我是OB!今天来聊聊alloc&init和dealloc!一、对象的创建:alloc&init执行Cat *cat = [[Cat alloc]init];时,发生了什么?alloc开辟一块内存给对象,让它不释放,并且把地址返回给指针。init对这块内存进行初始化有下面的继承关系:Cat : Animal Animal : NSObject@interface Animal : NSObject@property (nonatomic, strong)NSString原创 2020-07-16 15:55:20 · 513 阅读 · 0 评论 -
iOS:架构师之路(一)架构由来
在编程的江湖中哪些人能成为江湖高手,取决于思考! 在开发的很多时候,理论一直被忽视,很多程序猿(以前也包括我)只关注怎么实现某个功能,而并不关注为什么要这样做?这样做的好处是什么?如果能在开发中带着这两个问题去思考,我相信成为ACE将会事半功倍! 一个成熟的架构设计者,会对架构中每个模块甚至每个功能做非常成熟的考虑!1-业务逻辑和需求功能 在项目开始前,先考虑几个问题: a,正确的登录逻辑是原创 2017-10-23 18:07:42 · 1903 阅读 · 0 评论 -
iOS三种定时器:NSTimer,CADisplayLink,dispatch_source_t
iOS三种定时器一、 NSTimer子线程中需要添加到RunLoop中[loop addTimer:timer forMode:NSRunLoopCommonModes];self.timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(timerTest) userInfo:nil repeats:YE原创 2020-07-13 14:06:18 · 520 阅读 · 0 评论 -
iOS:线程终止以及GCD中dispatch_semaphore,dispatch_barrier_async,dispatch_group使用说明
刚好遇见你 - J1,今天更新一下关于线程的一些知识。相对于 GCD ,NSoperation 使用更加灵活,GCD虽然方便 但是一旦开启,不能终止他的任务了,在开发中不太适合有些场景。那么 NSOperation 使用需要注意一点,就是依赖添加的时间 应该是在添加进队列之前。不然依赖无效。 @property (nonatomic,stron原创 2017-01-11 20:54:54 · 1479 阅读 · 0 评论 -
iOS:Weak指针原理
大家好,我是OB!今天来聊聊Weak指针!- (void)viewDidLoad { [super viewDidLoad]; __strong Animal *strong_animal; __weak Animal *weak_animal; __unsafe_unretained Animal *unsafe_animal; NSLog(@"1111"); { Animal *animal = [[Animal al原创 2020-07-08 17:57:35 · 367 阅读 · 0 评论 -
iOS:AutoReleasePool释放对象的时刻
大家好,我是OB!今天来聊聊AutoReleasePool!AutoReleasePool自动释放池,如果有大量的临时数据可以使用AutoReleasePool,能更加快捷的释放临时对象。下面来看看他的底层结构 @autoreleasepool { } OC的autoreleasepool在经过clang编译后,变成了结构体__AtAutoreleasePool。struct __AtAutoreleasePool { void * atautoreleasepoolobj;原创 2020-07-08 15:53:53 · 1239 阅读 · 0 评论 -
iOS:多线程安全与Lock
大家好,我是OB!今天来聊聊锁!Lock 锁:防⽌止多个线程可能会访问同⼀块资源引发的问题,加锁可以保证在多线程环境下的数据访问安全,但同时牺牲了访问效率。1.自旋锁(OSSpinLock)是用于多线程同步的种锁,线程反复检查锁变量是否可用,处于忙等状态(一直进行do while循环)忙等:等待锁的线程会处于忙等(busy-wait)状态,一直占⽤用着CPU资源;High-level lock,⾼级锁,等不不到锁时忙等,不会休眠引入#import <libkern/OSAtomic.h原创 2020-07-07 18:34:25 · 270 阅读 · 0 评论 -
iOS:hook实现无侵入式埋点、统计
大家好,我是OB!,今天来聊聊iOS的埋点。不管是埋点,统计还是什么其他辟邪剑谱,主要的目的是为了了解用户行为习惯,进而开发出更友好的APP。埋点的形式主要有:统计页面停留时长页面出现次数按钮的点击次数在技术上,埋点主要包括代码埋点、可视化埋点和全埋点。埋点方式优点缺点代码埋点(侵入式)方便灵活,什么样的埋点都可以实现。包括各种奇葩埋点。维护成本高,由于到处都是埋点的代码,所以清理维护难可视化埋点/全埋点(非侵入式)埋点统一维护,解耦。适用于大量通用的原创 2020-07-07 15:15:11 · 1285 阅读 · 0 评论 -
iOS:crash日志收集
大家好,我是OB!今天来聊聊crash!前面说到 iOS利用runtime防崩溃的三大步,今天来看看万一程序奔溃了,怎么收集crash日志。一、crash日志收集NSException是OC中关于异常的类,它包含了reason异常原因,callStackSymbols堆栈调用信息,因此可以在程序crash时,利用系统回调NSSetUncaughtExceptionHandler可以获取crash日志。- (BOOL)application:(UIApplication *)application原创 2020-07-07 11:26:34 · 826 阅读 · 0 评论 -
Swift:实现KVO的willSet、didSet
一、KVOkvo键值观察者Swift继承NSObject的KVOswift 实现kvo需要两个条件,第一要是NSObject的子类,第二要在观察的属性添加@objc dynamicclass Animal: NSObject { @objc dynamic var name: String = "ob";}class ViewController: UIViewController { let dog = Animal.init(); var observation:原创 2020-07-06 16:33:09 · 717 阅读 · 0 评论 -
iOS:RunLoop底层结构与线程保活
大家好,我是OB! 今天来聊聊RunLoop!RunLoop 本质RunLoop就是一个运行循环,在每次循环中接受消息,处理消息,然后休眠或者进入下一次循环。RunLoop底层就是一个while循环;休眠:该线程会释放占用的所有资源(从CPU任务队列里移除),系统会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程或者系统才能被唤醒。RunLoop底层结构RunLoop也是一个对象,底层也是一个结构体struct __CFRunLoop(如下图)。具有以下特征原创 2020-07-03 18:00:32 · 591 阅读 · 0 评论 -
iOS:block的底层原理
大家好,我是OB!今天来聊聊大家的老熟人Block!blockblock 本质就是NSObject对象,把方法包装成了block块来看看block的真面目 void(^OBblock)(void) = ^{ NSLog(@"-------");};OBblock();/** 编译后*/void(*OBblock)(void) = &__main_block_impl_0( __main_block_func_0,原创 2020-07-02 14:54:02 · 353 阅读 · 0 评论 -
iOS:Runtime之Category、Extension、load、initialize
大家好,我是OB!今天来聊聊Runtime和四剑客(Category、Extension、load、initialize)爱恨情仇!一、category1、category中的方法会覆盖主类的方法吗先创建一个Person类和先看现象编译时我们可以发现,主类先开始compile,然后才是compile 分类。所以说从两个角度说:宏观(现象)角度:分类会覆盖主类的方法!当分类和主类同时实现- (void)walk;方法时,调用结果是调用的分类里面的方法,不管是哪个分类,都优先与主类方法;原创 2020-07-01 17:40:29 · 227 阅读 · 0 评论 -
NSObject常用方法superclass,[super superclass],isMemberOfClass,isKindOfClass,isEqual,clang
大家好,我是OB!今天结合源码来看看NSObject常用方法首先声明两个类,Animal,Dog,继承关系如下@interface Animal: NSObject@interface Dog: Animal1、 [Dog class]和[dog class]一样吗?新手还在看,老手已经开始NSLog了。结果是一样的。看看源码就清楚了,+ (Class)class { return self;}- (Class)class { return object_ge原创 2020-06-30 18:42:28 · 465 阅读 · 0 评论 -
iOS:RunTime基本使用与实际运用
大家好!我是OB。今天来聊聊runtime!一、RunTime是什么?定义:RunTime实际上是一个库,这个库使我们可以在程序运行时动态的创建对象、检查对象,修改类和对象的方法。他的作用其实就是在程序运行时做一些事情。下面我们来看看它的常用方法,前提引入头文件 #import <objc/message.h>,再去【XCode】->【Build Settings】 -> 【Enable Strict Checking of objc_msgSend Calls】这个字段设原创 2020-06-30 11:08:25 · 1174 阅读 · 0 评论 -
iOS:class_copyIvarList和class_copyPropertyList
// 今天来揭开神秘的Runtime机制的面纱。希望不局限于会,最重要的是会用!!!!先自己创建一个Dog 类当然包含头文件哈#import #import "TestRunTime-Swift.h"- (void)viewDidLoad { [superviewDidLoad原创 2017-04-25 10:27:03 · 436 阅读 · 0 评论