![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
iOS笔记
文章平均质量分 88
LzhSweeterSmile
我是图图小淘气 面对世界好好奇
展开
-
Cocoa 文本架构指南
字体处理本章解释了 Cocoa 文本系统如何处理字体。它解释了如何在应用程序中使用字体面板、如何直接使用字体对象以及如何使用字体管理器。字体面板字体面板,也称为字体窗口,是一个用户界面对象,显示可用字体系列和样式的列表,让用户预览它们并更改用于显示文本的字体。文本对象,例如NSTextView,与NSFontPanel和NSFontManager对象来实现 AppKit 的字体转换系统。默认情况下,文本对象使用其选择中的第一个字体或其键入属性保持“字体”面板更新。它还会更改显示文本的字体,以转载 2021-06-24 14:43:18 · 323 阅读 · 0 评论 -
iOS App启动优化(三)—— 自己做一个工具监控App的启动耗时
前两篇介绍了《iOS App的启动流程》、《Time Profiler工具的使用》。本篇将介绍通过hook底层objc_msgSend来掌握所有Objective-C方法的执行耗时。一、什么是hook?定义:hook是指在原有方法开始执行时,换成你指定的方法。或在原有方法的执行前后,添加执行你指定的方法。从而达到改变指定方法的目的。例如:使用runtime 的 Method Swizzle。 使用Facebook所开源的fishhook框架。前者是ObjC运行时提供的“方法交换”能力。转载 2021-03-12 20:42:22 · 709 阅读 · 0 评论 -
iOS App启动优化(二)—— 使用“Time Profiler”工具监控App的启动耗时
一、查看耗时(1)查看Pre-Main()阶段花费的总时间想查看Pre-Main阶段的时间比较简单。直接打开Xcode,找到Product->Scheme->Edit Scheme->Run->Arguments->Environment Variables->DYLD_PRINT_STATISTICS 设置为 YESRun一下,就能看到pre-Main的耗时日志啦~(2)查看Main()函数后的花费时间查看Main函数之后的耗时,目前有两种转载 2021-03-12 19:46:56 · 1687 阅读 · 0 评论 -
iOS App启动优化(一)—— 了解App的启动流程
一、“冷启动”与“热启动”首先,我们先来区分两个启动的概念。 冷启动:App点击启动前,此时App的进程还不在系统里。 需要系统新创建一个进程分配给App。(这是一次完整的App启动过程) 热启动:App在冷启动后用户将App退回后台,此时App的进程还在系统里。 用户重新返回App的过程。(热启动做的事较少) 主要区别:名称 区别 冷启动 启动时,App的进程不在系统里,需要开启新进程。 热启动 启动时,App的进程还在系统里,不需要开启新进程。转载 2021-03-12 19:10:34 · 476 阅读 · 0 评论 -
最新 GCD 定时器 比NSTimer更准时的定时器
#import "ViewController.h"@interface ViewController ()@property (nonatomic, strong) dispatch_source_t timer;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; dispatch_queue_t queue = dispatch_get_main_queue();// d.原创 2020-12-03 22:03:44 · 330 阅读 · 0 评论 -
最新 Objective-C objc_msgSend 消息发送底层原理
首先判断消息接收者是否为nil nil直接返回如果消息接收者是实例对象 它通过isa 到它的类对象的方法缓存cache(哈希表)中查找 O(1)如果消息接收者是类对象 它就通过isa 到它的元类对象中查找如果方法缓存cache找不到就到class_rw_t的方法列表中查找如果方法列表是有序的 二分查找 O(logN) 方法列表没有序 就普通线性遍历查找 O(N)如果找到了就调用方法 结束查找 并把方法 缓存到缓存列表中如果没找到且有父类就继续 到父类查找 重复上面的过程 直到基类N.原创 2020-11-29 18:51:25 · 326 阅读 · 0 评论 -
最新 Objective-C arm64位架构后的 isa指针 底层原理
首先 arm64位架构后的 isa指针 是个(union)共用体 储存了更多的信息union isa_t { isa_t() { } isa_t(uintptr_t value) : bits(value) { } Class cls; uintptr_t bits; struct { // 0,代表普通的指针,存储着Class、Meta-Class对象的内存地址 1,代表优化过,使用位域存储更多的信息 uintptr_t nonpointer原创 2020-11-29 14:10:56 · 444 阅读 · 0 评论 -
最新 Objective-C __block 底层原理
int main(int argc, const char * argv[]) { @autoreleasepool { __block int a = 10; void(^block)(void) = ^{ a = 20; NSLog(@"=====%d",a); // 20 }; block(); } return 0;}__block 之所以.原创 2020-11-29 12:07:39 · 104 阅读 · 0 评论 -
最新 Objective-C Block 捕获原理
// 全局变量int c = 10;// 全局静态变量static int d = 10;int main(int argc, const char * argv[]) { @autoreleasepool { // auto 自动变量 离开作用域自动销毁 // 局部变量 auto int a = 10; // 静态局部变量 static int b = 10; void(^.原创 2020-11-28 16:29:55 · 141 阅读 · 0 评论 -
最新 Objective-C 关联对象 AssociatedObject 原理
AssociationsManagerAssociationsHashMap <DisguisedPtr<objc_object>, ObjectAssociationMap>ObjectAssociationMap <const void *, ObjcAssociation>ObjcAssociation {uintptr_t _policy,id _value}objc_setAssociatedObject(self, @selector(name),.原创 2020-11-28 02:58:30 · 175 阅读 · 0 评论 -
最新 Objective-C +initialize方法 加载顺序
+initialize方法会在类的第一次接收到消息的时候调用优先调用父类的+initialize 再调用子类的+initialize(前提是父类没有初始化过)如果子类没有实现+initialize 会调用父类的+initialize 所以父类的+initialize会被多次调用(初始化只有一次)如果分类实现了+initialize,会覆盖类本身的+initialize调用/***********************************************************原创 2020-11-28 01:09:54 · 166 阅读 · 0 评论 -
最新 Objective-C +load方法 加载顺序
所用源码: https://opensource.apple.com/tarballs/objc4/objc4-781.tar.gz先调用类的+load 在调用分类的/************************************************************************ call_load_methods* Call all pending class and category +load methods.* Class +load methods原创 2020-11-28 00:19:21 · 335 阅读 · 0 评论 -
最新 Objective-C 分类Category 底层原理
所用源码: https://opensource.apple.com/tarballs/objc4/objc4-781.tar.gz通过runtime动态将某个类的分类的方法合并到类对象 元类对象中分类 编译的时候生成这种结构体struct category_t { const char *name; classref_t cls; struct method_list_t *instanceMethods; struct method_list_t *clas原创 2020-11-27 01:02:17 · 98 阅读 · 0 评论 -
最新 内存对齐
struct NSObject_IMPL { Class isa;};struct Person_IMPL { struct NSObject_IMPL NSObject_IVARS; // 8 int _age; // 4}; // 16 内存对齐:结构体的大小必须是最大成员大小的倍数struct Student_IMPL { struct Person_IMPL Person_IVARS; // 16 int _no; // 4}; // 16.原创 2020-11-26 00:17:55 · 91 阅读 · 0 评论 -
最新 Objective-C 和 Swift 源码地址
https://opensource.apple.com/tarballs/objc4/https://github.com/apple/swift原创 2020-11-25 23:57:18 · 176 阅读 · 0 评论 -
谈一下OC的Block的类型
谈一下OC的Block首先Block也是OC对象 NSBlock最终也是继承自NSObjectBlock有三种类型__NSGlobalBlock__(全局)__NSStackBlock__(栈)__NSMallocBlock__(堆)如果Block没有使用到局部变量 被创建的就是全局BlockBlock 内部可以使用静态变量和全局变量 只要不适用局部变量 就是全局的如果Block 使用了 局部变量 创建的是栈BlockARC 可以用strong 和copy修饰 但是MRC一定要用cop原创 2020-11-20 23:29:14 · 190 阅读 · 0 评论 -
最新 git 拉取其他分支并且合并代码
1.先提交一波 为后续切分支准备(my为自己的分支 other为想要拉取的分支)git add .git commit -m 'my commit'git push origin my2.然后git切换到你所要拉取的分支xxx2 拉取该分支代码git checkout othergit pull origin other 3.切回自己的分支git checkout mygit merge other...原创 2020-11-18 14:24:30 · 3049 阅读 · 0 评论 -
最新 iOS开发中的11种锁以及性能对比
在平时开发中我们经常会使用多线程,多线程为我们带来了很大便利,也提高了程序的执行效率,但同时也带来了Data race,Data race的定义很简单:当至少有两个线程同时访问同一个变量,而且至少其中有一个是写操作时,就发生了Data race。所以这是就要利用一些同步机制来确保数据的准确性,锁就是同步机制中的一种。怎么检测项目中的Data race?只需要在设置中勾选Thread Sanitizer 即可,顺便可以勾选Pause on issues 就可以断点到相应的代码。更多延伸内容请参考转载 2020-11-10 00:12:35 · 760 阅读 · 0 评论 -
最新 Matrix-iOS 卡顿监控
前言在早期开发 iOS 微信的过程中,我们时不时会收到类似的反馈:“我的微信卡在主界面,怎么也滑动不了” “我的微信从后台切换前台卡了一下,最近偶尔会遇到几次”,等等。这类问题有个共同点:用户的微信在一段时间内无法点击;即使获得用户的操作路径,也无法重现。我们把这类问题叫做卡顿问题。这类问题很影响用户的体验,是必须进行解决的。为了精确地定位用户的卡顿问题,iOS 微信在 2014 年 9 月份上线了卡顿监控系统。在这几年间,卡顿监控经历了几次优化,不断成熟,在这里我们将其分享出来。什么是转载 2020-10-20 11:15:03 · 1277 阅读 · 0 评论 -
最新 iOS 性能优化实践:头条抖音如何实现 OOM 崩溃率下降50%+
iOS OOM 崩溃在生产环境中的归因一直是困扰业界已久的疑难问题,字节跳动旗下的头条、抖音等产品也面临同样的问题。在字节跳动性能与稳定性保障团队的研发实践中,我们自研了一款基于内存快照技术并且可应用于生产环境中的 OOM 归因方案——线上 Memory Graph。基于此方案,3 个月内头条抖音 OOM 崩溃率下降 50%+。本文主要分享下该解决方案的技术背景,技术原理以及使用方式,旨在为这个疑难问题提供一种新的解决思路。OOMOOM 其实是Out Of Memory的简称,指的是在 iOS转载 2020-10-20 10:08:33 · 1481 阅读 · 0 评论 -
最新 iOS内存abort(Jetsam) 原理探究
iOS内存abort(Jetsam) 原理探究苹果最近开源了iOS系统上的XNU内核代码,加上最近又开始负责手淘/猫客的稳定性及性能相关的工作,所以赶紧拜读下苹果的大作。今天主要开始想分析跟abort相关的内存Jetsam原理。什么是Jetsam关于Jetsam,可能有些人还不是很理解。我们可以从手机设置->隐私->分析这条路径看看系统的日志,会发现手机上有许多JetsamEvent开头的日志。打开这些日志,一般会显示一些内存大小,CPU时间什么的数据。之所以会发生这么Jetsa转载 2020-10-20 09:28:26 · 5499 阅读 · 0 评论 -
最新 iOS13 苹果登录
应用集成第三方登录,iOS 13之后必须集成苹果登录,否则审核会被拒的。较为常用的第三方登录是微信和QQ,微信不提供网页登录授权,所以用户手机没有安装微信最好是不展示微信登录入口,QQ是提供网页授权登录的,所以提供的第三方登录入口QQ可以不加判断直接展示。苹果登录只在iOS 13以后才可以使用,所以系统版本小于13的也不能展示苹果入口。微信和QQ不多说,直接在开发平台注册应用,拿到APPID和APP secret去调用微信和QQ的SDK,处理对应的回调,在Xcode设置URL Schemes和白名单。转载 2020-10-16 15:50:53 · 1757 阅读 · 0 评论 -
最新 解决CocoaPods/Specs下载缓慢的问题
每次在更新CocoaPods的Specs时候都会特别慢,很容易失败。cocoapods 的 sepcs 文件是放在 ~/.cocoapods/repos目录git clone https://github.com/CocoaPods/Specs.git master其实无需全部 clone 下来,可以只 clone 最近一个 commit 的全部代码就可以。终端执行:git clone --depth=1 https://github.com/CocoaPods/Specs.git原创 2020-10-16 11:21:28 · 1316 阅读 · 0 评论 -
iOS 13的一些适配
/** Getting keyWindow. */-(UIWindow *)keyWindow{ UIView *textFieldView = _textFieldView; if (textFieldView.window) { return textFieldView.window; } else { static __weak UIWindow *cachedKeyWindow = nil; .原创 2020-09-25 15:02:54 · 430 阅读 · 0 评论 -
iOS仿抖音小视频播放遇到的问题
今天从视频文件格式的另外一个角度介绍,MP4文件的box排列顺序是如何影响,在线短视频的播放以及秒播优化的。 MP4文件中的所有数据都装在box中 (iso-14496-12/14) (QuickTime中为atom)即mp4是由若干个box组成的 先简单介绍几个重要的box,以便诸位在后续学习时心中有数: 1、 ftyp box,在文件的开始位置,描述的文件的版本、兼容协议等; 2、 moov box,这个box中不包含具体媒体数据,但包含本文件中所有媒体数据的宏观描述原创 2020-07-15 11:49:18 · 866 阅读 · 0 评论 -
iOS Instruments使用
一、Instruments介绍Instruments 一个很灵活的、强大的工具,是性能分析、动态跟踪 和分析OS X以及iOS代码的测试工具,用它可以极为方便收集关于一个或多个系统进程的性能和行为的数据,并能及时随着时间跟踪而产生的数据,并检查所收集的数据,还可以广泛收集不同类型的数据.也可以追踪程序运行的过程,这样instrument就可以帮助我们了解用户的应用程序和操作系统的行为。 总结一下instrument能做的事情: 1. Instruments是用于动态调追踪和分析OS X和iOS的转载 2020-07-09 16:24:34 · 8293 阅读 · 1 评论 -
iOS 去除 UITextView 内边距
去除 textView 左右边距:self.textView.textContainer.lineFragmentPadding = 0;去除 textView 上下边距:self.textView.textContainerInset = UIEdgeInsetsZero;原创 2020-07-02 15:31:15 · 1050 阅读 · 0 评论 -
项目添加新的第三方 不更新本地已经存在的第三方
pod install --verbose --no-repo-update原创 2020-07-02 14:53:45 · 122 阅读 · 0 评论 -
iOS Xcode11 的代码块位置
~/Library/Developer/Xcode/UserData/CodeSnippets原创 2020-07-02 09:37:25 · 335 阅读 · 0 评论 -
iOS开发 Tips 通过PhAsset获取视频路径和视频大小
PHVideoRequestOptions *options = [[PHVideoRequestOptions alloc] init];options.version = PHVideoRequestOptionsVersionOriginal;[[PHImageManager defaultManager] requestAVAssetForVideo:asset options:options resultHandler:^(AVAsset *asset, AVAudioMix *audioMi原创 2020-06-29 15:18:39 · 5530 阅读 · 0 评论