
内存相关
文章平均质量分 87
想名真难
这个作者很懒,什么都没留下…
展开
-
ARC下获取retainCount, 获取自动释放池里的东西
可以使用CFGetRetainCount在ARC下获取对象的引用计数值:CFGetRetainCount((__bridge CFTypeRef)obj)NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)obj));原创 2022-03-19 20:18:55 · 532 阅读 · 0 评论 -
iOS内存疑惑: 为什么Xcode Navigator和Instuments Allocations差别很大
同一个app, 没有任何改动, 使用xcode查看内存占用是118M, 而使用Instuments Allocations 查看是153M, 为什么会不一样呢?转载 2021-12-19 11:41:15 · 1956 阅读 · 0 评论 -
ios 计算图片解压为位图后大小
最后又找了一下SD的计算位图大小, 对比确认了一下,计算单张图片和SD的一致, 但是SD考虑的比较全面,处理了gif图片的情况.原创 2021-12-03 22:29:53 · 1412 阅读 · 0 评论 -
iOS 内存在操作系统上体现
导读最近笔者所在公司的iOS App端在经历了几个版本的疯狂的业务迭代,几个主要模块例如首页、分类在最近的几次迭代中变得越来越重,最终在最近的新版本暴露出了性能问题。AdHoc包中设置的内存报警最近经常被触发阀值 线上的监控日志的性能相关的crash明显增加由于不排除之后的版本这几个一级模块的业务会变的越来越重,也为了技术进阶,笔者开始着手于本次内存相关的deep learning和内存优化工作。专题简述关于内存优化,笔者希望从下面三个方面进行整理和论述1、原理篇:OS&iOS转载 2021-08-08 09:35:48 · 466 阅读 · 0 评论 -
Xcode特性Address Sanitizer,对比僵尸对象
昨天发现微博的圈子里iOS学习氛围比较好,所以特意注册了一个新浪微博。无意中在微博里看到了@没故事的卓同学的文章Xcode7中你一定要知道的炸裂调试神技,介绍Xcode7中新增了AddressSanitizer工具可以捕获EXC_BAD_ACCESS。然而Xcode中不是已经有了Zombie了么?怎么又出来了一个Address Sanitizer,他们有什么区别呢?AddressSanitizer VS Zombie原理zombie: zombie的原理是用生成僵尸对象来替换dealloc的实转载 2021-08-08 08:47:28 · 2217 阅读 · 0 评论 -
iOS信号量报错crash细分
常见信号SIGTERM SIGSEGV SIGINT SIGILL SIGABRT SIGFPE更多的信号量定义在<signal.h>, 这里截取了部分常见的Defined in header <signal.h>#define SIGTERM /*implementation defined*/#define SIGSEGV /*implementation defined*/#define SIGINT /*implementation define转载 2021-08-07 17:53:09 · 2793 阅读 · 0 评论 -
iOS中使用自定义字体, 动态下载字体
在iOS的开发中经常遇到需要使用一些自定义的字体文件,比如仿宋_GB2312、方正小标宋_GBK等。之前我们为了使用这些自定义的字体,在应用的资源包中放入这些字体文件。因为字体文件通常比较大,有的一个字库就达到10M以上(拿方正小标宋_GBK这个字库来说就有13M之多),这样打包后的ipa文件的体积就可能会变得很大,对于只有个别的模块需要特殊的字体样式的应用来说很不划算,那么在iOS6.0以后苹果就开放了动态加载字体的权限。下面就iOS中使用字体的这两种方式进行介绍。使用静态字体1、将字体文件拷贝到转载 2021-02-24 18:53:49 · 3380 阅读 · 0 评论 -
详解KVC,低配版实现
无论是Swift还是Objective-C,KVC的定义都是对NSObject的扩展来实现的(Objective-C中有个显式的NSKeyValueCoding类别名,而Swift没有,也不需要)。所以对于所有继承了NSObject的类型,也就是几乎所有的Objective-C对象都能使用KVC(一些纯Swift类和结构体是不支持KVC的),下面是KVC最为重要的四个方法- (nullable id)valueForKey:(NSString *)key;转载 2020-12-20 23:20:09 · 472 阅读 · 0 评论 -
Tagged Pointer分析
在objc4源码中,我们经常会在函数中看到Tagged Pointer。Tagged Pointer究竟是何方神圣?从64位开始,iOS引入了Tagged Pointer技术,用于优化小对象(NSString,NSNumber,NSDate)的存储。主要为了解决两个问题:内存资源浪费,堆区需要额外的开辟空间 访问效率,每次set/get都需要访问堆区,浪费时间特点:专门用来存储小对象,比如NSString,NSNumber,NSDate Tagged Pointer指针的值不再是堆区地转载 2020-09-18 11:29:18 · 838 阅读 · 1 评论 -
iOS内存对齐+calloc分析
在了解内存对齐之前先了解一下各数据类型在内存中的大小,目前我们比较常用的是64位系统,所以我们的研究对象统一采用64位的大小作为参考。一. 如何获取内存的大小获取NSObject对象的内存大小,需要用到以下几个函数:1.class_getInstanceSize 2.malloc_size 3.sizeOf 我们先来一段代码,然后调用上面的几函数,看一下结果#import <malloc/malloc.h>int main(int argc, const char转载 2020-09-08 09:55:48 · 494 阅读 · 0 评论 -
循环引用检测工具FBRetainCycleDetector
FBRetainCycleDetector用以检测循环引用,可以检测NSObject的循环引用、关联对象(Associated Object)的循环引用、block的循环引用。一句话描述原理: 把可疑的对象告诉FBRetainCycleDetector,然后FBRetainCycleDetector会查找可疑对象的所有strong属性, 关联对象, block,构成一个最大长度为10的有向图, 按照深度优先遍历看看是否存在环, 如果有环说明存在循环应用,并把所存在的引用循环中各对象和引用在终端进行打印.转载 2020-08-31 16:29:29 · 1835 阅读 · 0 评论 -
为什么操作系统需要虚拟内存
操作系统中的 CPU 和主内存(Main memory)都是稀缺资源,所有运行在当前操作系统的进程会共享系统中的 CPU 和内存资源,操作系统会使用 CPU 调度器分配 CPU 时间并引入虚拟内存系统以管理物理内存,本文会分析操作系统为什么需要虚拟内存。在回答虚拟内存存在的必要性之前,我们需要理解操作系统中的虚拟内存是什么,它在操作系统中起到什么样的作用。正如软件工程中的其他抽象,虚拟内存是操作系统物理内存和进程之间的中间层,它为进程隐藏了物理内存这一概念,为进程提供了更加简洁和易用的接口以及更加复杂的转载 2020-08-27 11:56:48 · 2754 阅读 · 0 评论 -
iOS检测内存泄漏, 系统工具+第三库
什么是内存泄漏,通俗来说就是有一块内存区域你申请占用,但当你不使用的时候没有正确的释放掉, 造成内存浪费,这就是内存泄漏,APP内存超过一定值后系统会强制结束进程;引入ARC机制后,系统自动管理内存,大大减轻了开发工作量,但一些特殊情况仍然会有内存泄漏发生,需要特别注意。一般易造成泄漏的点Retain Cycle,Block强引用 NSTimer/CADisplayLink释放不当 第三方提供方法造成的内存泄漏 CoreFoundation方式申请的内存,忘记释放常规的监测方法 A转载 2020-08-21 11:04:09 · 812 阅读 · 0 评论 -
黑箱中的retain 和 release
在接口设计时,我们经常要考虑某些意义上的平衡。在内存管理中,Objective-C 同时为我们提供了增加引用计数的retain和减少引用计数的release方法。这篇文章会在源代码层面介绍 Objective-C 中retain和release的实现,它们是如何达到平衡的。从 retain 开始如今我们已经进入了全面使用 ARC 的时代,几年前还经常使用的retain和release方法已经很难出现于我们的视野中了,绝大多数内存管理的实现细节都由编译器代劳。在这里,我...转载 2020-08-16 16:56:38 · 454 阅读 · 0 评论 -
ARC的实现原理 -- 概要
自动的引用计数(Automatic Reference Count 简称 ARC),是苹果在 WWDC 2011 年大会上提出的用于内存管理的技术。引用计数(Reference Count)是一个简单而有效的管理对象生命周期的方式。当我们创建一个新对象的时候,它的引用计数为 1,当有一个新的指针指向这个对象时,我们将其引用计数加 1,当某个指针不再指向这个对象是,我们将其引用计数减 1,当对象的引用计数变为 0 时,说明这个对象不再被任何指针指向了,这个时候我们就可以将对象销毁,回收内存。由于引用计数简转载 2020-08-12 18:42:09 · 795 阅读 · 0 评论 -
解决NSTimer循环应用(完美版), 不需要再 viewDidDisappear 中释放
工程下载地址 :http://download.youkuaiyun.com/detail/u014600626/9828428首先本文受这人的启发,原文, 原文中写的还是挺复杂的,没看完,但是看了一部分,瞬间收到启发,就写一个简化版的,低配版的自己在工程中用用 . 首先timer 是干什么的 ? 常用的timer 基本是做2种事情, 一个是延迟一段时间(比如10S) 然后执行原创 2017-04-28 14:28:16 · 584 阅读 · 0 评论 -
didReceiveMemoryWarining 处理
根据网上的说法进行总结:iOS的UIViewController 类给我们提供了处理内存不足的接口。在iOS 3.0 之前,当系统的内存不足时,UIViewController的didReceiveMemoryWarining 方法会被调用,我们可以在didReceiveMemoryWarining 方法里释放掉部分暂时不用的资源。 从iOS3.0 开始,转载 2016-03-12 15:17:39 · 299 阅读 · 0 评论 -
Block原理,为什么block能捕获变量 -- 原理篇
主要参考了这些文章 , 有删改:http://www.jianshu.com/p/ee9756f3d5f6https://www.jianshu.com/p/c99f4974ddb5https://www.jianshu.com/p/8865ff43f30e 前言Blocks是C语言的扩充功能,而Apple 在OS X S...原创 2017-12-02 18:44:35 · 11948 阅读 · 0 评论 -
程序内存空间(代码段、数据段、堆栈段)
https://blog.youkuaiyun.com/ywcpig/article/details/52303745 有删减在冯诺依曼的体系结构中,一个进程必须有:代码段,堆栈段,数据段。进程的虚拟地址空间图示如下:栈段: 1. 为函数内部的局部变量提供存储空间。 2. 进行函数调用时,存储“过程活动记录”。 3. 用作暂时存储区。如计算一个很长的算术表达式时,...转载 2018-08-09 11:14:51 · 9465 阅读 · 3 评论 -
Runloop相关 autorelease
https://www.jianshu.com/p/5559bc15490d前言在MRC下, 我们需要手动管理内存, 写一大堆的retain, release代码, 稍不留神就会造成内存泄露; 而ARC下, 编译器帮我们屏蔽掉了这些繁琐的代码, 我们不需要再一条一条地写retain, release了, 可以专心地把精力放在业务逻辑, 技术上.在MRC下, 调用[object autore...转载 2018-08-08 17:53:40 · 289 阅读 · 0 评论 -
isa和superclass,对象的内存分布 -- 类的结构体-1
ios中对象有几种?实例对象:isa 指针、具体的成员变量的值(自己的公开,私有变量+父类的公开,私有变量),比如age=10,这里存的是10,类对象:isa、superclass、类属性信息(用class修饰的属性)、对象方法、协议、成员变量列表,这里存的是变量的名字,比如age,也是既有自己的,也有父类的元类对象:isa、superclass、类方法……类对象也是可以有属性...原创 2018-12-24 17:21:14 · 392 阅读 · 0 评论 -
iOS底层weak的实现原理
weak是弱引用,所引用对象的计数器不会加一,并在引用对象被释放的时候自动被设置为nil。那么weak的原理是什么呢?weak表其实是一个hash(哈希)表 (字典也是hash表),Key是所指对象的地址,Value是weak指针的地址数组。通常用于解决循环引用问题。下面就分析一下weak的工作原理。weak 实现原理的概括Runtime维护了一个weak表,用于存储指向某个对象的所有we...转载 2019-01-24 10:29:14 · 3780 阅读 · 0 评论 -
Block原理,为什么block能捕获变量 -- 实战篇
书接上文 : block的原理篇 :https://blog.youkuaiyun.com/u014600626/article/details/78697535__block实现原理我们继续研究一下__block实现原理。__block修饰非对象的变量先来看看普通变量的情况。#import <Foundation/Foundation.h>int main(int ...原创 2019-01-21 14:00:20 · 1197 阅读 · 0 评论 -
苹果对isa的优化 -- 类的结构体-2
原文 :https://www.jianshu.com/p/d949b51d5de7isa的本质在学习Runtime之前首先需要对isa的本质有一定的了解,这样之后学习Runtime会更便于理解。回顾OC对象的本质,每个OC对象都含有一个isa指针,__arm64__之前,isa仅仅是一个指针,保存着对象或类对象内存地址,在__arm64__架构之后,apple对isa进行了优化,变...转载 2019-01-28 19:19:06 · 580 阅读 · 0 评论 -
iOS图片的解压缩,位图,从文件到屏幕上的过程
原文 :https://www.jianshu.com/p/72dd074728d8 ,http://blog.leichunfeng.com/blog/2017/02/20/talking-about-the-decompression-of-the-image-in-ios/从调用[UIImage imageNamed:@"logo"]; 发生了什么?一.图像从文件到屏幕...原创 2019-07-03 10:59:40 · 1449 阅读 · 0 评论 -
ios NSCache的使用
NSCache第一次接触到是看SDWebImage的源码的时候,使用NSCache的子类做了图片的内存缓存.NSCache也可以做Key-Value的映射,但是不同于NSDictionary的地方在于:1.当系统资源将要耗尽的,NSCache可以自动删减缓存,遵循了LRU(lease recently used)算法,如果是字典的话,就需要监听didReceiveMemoryWarning...原创 2019-08-29 19:17:19 · 1045 阅读 · 0 评论 -
ios内存优化
1. 用ARC管理内存ARC(Automatic ReferenceCounting, 自动引用计数)和iOS5一起发布,它避免了最常见的也就是经常是由于我们忘记释放内存所造成的内存泄露。它自动为你管理retain和release的过程,所以你就不必去手动干预了。忘掉代码段结尾的release简直像记得吃饭一样简单。而ARC会自动在底层为你做这些工作。除了帮你避免内存泄露,ARC还可以帮你原创 2016-03-12 10:13:32 · 368 阅读 · 0 评论