-
从头开始做一个开发助手工具(一):控件的搭建
起因在开发中,我们往往在准备提测的时候会进行各种性能的检测和bug检测。那么为什么不能在开发中就去就去检测发现并且解决一些简单的问题呢?我们可不可以做一个工具,来进行性能的检测和app信息的展示,方便我们去进行测试和修复呢?带着这个想法,我准备在原有开发小工具的基础上,整合出一个debug阶段的开发助手(并且可以在整合和开发的过程中,方便自己整合之前的知识)。类似的工具有FBMemoryProfiler、DoraemonKit等等,这些都是比较成熟的项目,我们也可以去实现一个。项目地址Ba...…
-
RunLoop笔记
RunLoop笔记对于最开始我们写的程序来说,执行完任务之后就会退出。比如这样的int main(int argc, char * argv[]) { NSlog(@"hello world"); return 0;}但是对于App,这就有些不合时宜了。我们需要程序有序的执行,在有活动的时候迅速反应,在没有任务执行的时候不应该直接退出,而是处于一种待执行、休眠的状态等待事件的执行。int main(int argc, char * argv[]) { while (App...…
-
block笔记(四):扩展问题
block(四):修改block的实现这里将通过几道面试题来扩展知识。这几道题取自sunnyxx。Question1 如何在禁止直接调用block的情况下继续使用block?- (void)blockProblem { __block int a = 0; void (^block)(void) = ^{ self.string = @"retain"; NSLog(@"biboyang"); NSLog(@"biboyang%d",a...…
-
DEAD in Memory
虚拟内存的来由一个系统中的进程是与其他进程共享CPU和主存资源的,最开始我们直接访问物理内存地址,但是后来我们发现会造成各种各样的问题: 地址空间不隔离 所有的进程都可以直接访问物理地址,那表明各个进程的内存空间不是互相隔离的。有些恶意的进程或者被注入恶意代码的进程非常容易去改写其他进程的内存数据,以达到破坏的目的。 内存使用效率低 由于没有有效的内存管理机制,需要一个程序执行时,会将整个程序装入内存中然后开始执行。如果我们这个时候突然想要运行另外一个程序,那么很可能...…
-
SDWebImage源码解读(六)
暂时告一段落,剩余的有时间再去阅读。这里准备写一下相关的问题。(一) 加载大图的内存暴涨的原因这个应该写到压缩解码里的。但是那边没写完,就放到这里。[[SDImageCache sharedImageCache] setShouldDecompressImages:NO];[[SDWebImageDownloader sharedDownloader] setShouldDecompressImages:NO];使用这两个方法。我们将图片存储的时候,是二维化的存储的,会将图像存储为位图数据...…
-
SDWebImage源码解读(五)
压缩解码图片施工中。可以先查看这个链接学习。知识点有点多。https://dreampiggy.com/2017/10/30/iOS%E5%B9%B3%E5%8F%B0%E5%9B%BE%E7%89%87%E7%BC%96%E8%A7%A3%E7%A0%81%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B%EF%BC%88Image:IO%E7%AF%87%EF%BC%89/…
-
SDWebImage源码解读(四)
SDWebImage (v4.4.1)-SDWebImageCache#pragma mark--------本地查找缓存,注意,这里设计变化很大,原本是先判断内存图片,现在是开启磁盘队列的里面判断内存图片// 先查询内存缓存,如果没有,然后再异步查找磁盘缓存- (nullable NSOperation *)queryCacheOperationForKey:(nullable NSString *)key options:(SDImageCacheOptions)options don...…
-
SDWebImage源码解读(三)
SDWebImage (v4.4.1)-SDWebImageDownloader- (nullable SDWebImageDownloadToken *)downloadImageWithURL:(nullable NSURL *)url options:(SDWebImageDownloaderOptions)options ...…
-
SDWebImage源码解读(二)
SDWebImage (v4.4.1)-SDWebImageManager以在一个UIImageView上加载网络图片为例,看看要经历那些流程。第一步,调用- (void)sd_setImageWithURL:(nullable NSURL *)url; 这里运用了一个代码技巧,Designated Initializer,我们可以称之为”全能初始化法”。提供了一个初始化方法,其他方法均调用此方法。 第二步,调用- (void)sd_setImageWithURL:(nulla...…
-
SDWebImage源码解读(一)
SDWebImage (v4.4.1)特点: Categories for UIImageView, UIButton, MKAnnotationView adding web image and cache management An asynchronous image downloader - 异步下载 An asynchronous memory + disk image caching with automatic cache expiration hand...…
-
iOS中类簇的使用
这篇文章由很多平时的笔记积攒而成,看起来会有些杂乱,会有很多需要改进的地方,希望发现问题的朋友不吝赐教。 类簇类簇是Foundation框架广泛使用的设计模式。类簇在公共抽象超类下对多个私有的具体子类进行分组。以这种方式对类进行分组简化了面向对象框架的公共可见体系结构,而不会降低其功能丰富度。类簇是基于抽象工厂设计模式的。我将苹果官方文档中的有关类簇的部分翻译了过来,抽象工厂抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端...…
-
类簇的官方翻译
类簇 在官方文档中的解释 官方文档中的解释以下是翻译类簇类簇是Foundation框架广泛使用的设计模式。类簇在公共抽象超类下对多个私有的具体子类进行分组。以这种方式对类进行分组简化了面向对象框架的公共可见体系结构,而不会降低其功能丰富度。类簇是基于抽象工厂设计模式的。没有类簇的情况:简单的概念,复杂的接口为了说明类簇结构及其优点,考虑构建定义对象以存储不同类型(char、int、float、double)数量的类层次结构的问题。因为许多不同类型具有许多共同特征(例如,它们可以从一种类型...…
-
property的研究(二):weak关键字
@property属性相关(二):weakweak的实现我们这里直接查看 objc4-723.tar.gz源码。节省点话说,可以分为以下三步:1、初始化时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。2、添加引用时:objc_initWeak函数会调用 objc_storeWeak() 函数, objc_storeWeak() 的作用是更新指针指向,创建对应的弱引用表。3、释放时,调用clearDeallocating函数。clearDea...…
-
MLeaksFinder源码解读
1.MLeaksFinder.h#import "NSObject+MemoryLeak.h"//#define MEMORY_LEAKS_FINDER_ENABLED 0#ifdef MEMORY_LEAKS_FINDER_ENABLED//_INTERNAL_MLF_ENABLED 宏用来控制 MLLeaksFinder库//什么时候开启检测,可以自定义这个时机,默认则是在DEBUG模式下会启动,RELEASE模式下不启动//它是通过预编译来实现的#define _INTERNAL_M...…
-
property的研究(一):来源
@property属性相关如果没有特殊标明,下面的所有代码都是在ARC环境下。官方文档@property的创造原因在不使用属性的时候,我们往往会如下创建对象@implementation ViewController{ NSString *aaa; }但是这里有个问题,在于对象布局在编译期已经被固定了。当你访问这个变量的时候,编译器就会将其替换为指针偏移量。这个偏移量是硬编码的,表示变量距离存放对象的内存区域的起始地址有多远。但是假如又加了一个变量,就要重新编译。这种问题有两种...…
-
iOS中isEqual和hash
hashABChash是一种用于处理查找时非常高效的数据结构。时间复杂度一般情况下可以直接认为是O(1)。散列技术是在记录的存储位置和它的关键字之间确立一个对应关系 f,使得关键字 key对应的存储位置 f(key)。函数 f被称之为哈希函数(hash function),使用哈希技术将数据存储在一块连续的地址区域中,该连续的存储空间我们称之为散列表,也就是哈希表(hash table)。我们在存储的时候,是用过哈希函数计算得到哈希地址,并按照哈希地址存储该记录;查找的时候,通过通过同样的...…
-
block笔记(三):内存泄漏和关键字
在不特殊说明是MRC的情况下,默认是ARC。Objective-C Automatic Reference Counting (ARC)怎么泄漏的我们知道,在ARC中,除了全局block,block都是在栈上进行创建的。使用的时候,会自动将它复制到堆中。中间会经历objc_retainBlock->_Block_copy->_Block_copy_internal方法链。换过来说,我们使用的每个拦截了自动变量的block,都会经历这写方法(注意这一点很重要)。通过之前的研究...…
-
block笔记(二):copy
在block(一)中了解了block的内存布局现在来看一下block的copy过程。Block_copy()这部分代码在Block.h中。#define Block_copy(...) ((__typeof(__VA_ARGS__))_Block_copy((const void *)(__VA_ARGS__)))#define Block_release(...) _Block_release((const void *)(__VA_ARGS__))所以Block_copy是一个宏,它将...…
-
block笔记(一):block的本质
简单概述先说结论: block是C语言的扩充功能,我们可以认为它是 带有自动变量的匿名函数。block是一个匿名的inline代码集合: 参数列表,就像一个函数。 是一个对象! 有声明的返回类型 可获得义词法范围的状态,。 可选择性修改词法范围的状态。 可以用相同的词法范围内定义的其它block共享进行修改的可能性 在词法范围(堆栈框架)被破坏后,可以继续共享和修改词法范围(堆栈框架)中定义的状态 block的实现在llvm的文件中,我找到...…
-
iOS倒计时的探究与选择
我们在开发应用的过程中,往往在很多地方需要倒计时,比如说轮播图,验证码,活动倒计时等等。而在实现这些功能的时候,我们往往会遇到很多坑需要我们小心的规避掉。因为文章内容的关系,要求大家都有一些runloop的基础知识,当然如果没有,也没什么特别大的问题。这里推荐一下 ibireme的这篇文章。话不多说,直接上正题:倒计时的种类在开发过程中,我们基本上只用了这几种方式来实现倒计时 1.PerformSelecter 2.NSTimer 3.CADisplayLink 4.GC...…