孙同生的博客

为美好的世界献上祝福

  • 首页
  • 标签
  • 分类
  • 归档
  • d3学习demo演示
  • 搜索

objc_msgSend相关结构体 消息发送原理

发表于 2016-10-10 | 更新于 2019-03-07 | 分类于 重学iOS , Runtime | 评论数: | 阅读次数:
本文字数: 16k | 阅读时长 ≈ 15 分钟

介绍 消息发送以及相关的结构体
apple open source

objc_msgSend

给对象发送消息写法:

	`id returnValue = [somneObject messageName:parameter];`

编译器会将上诉代码转换为:

id = returnValue = objc_msgSend(someObject,@selector(messageName:),parameter);

其中 someObject叫做“接受者”(receiver),messageName叫做“选择子”(selector),选择子和参数合称“消息”

objc_msgSend 的定义: 该函数有两个参数,一个 id 类型,一个 SEL 类型。

id objc_msgSend(id self, SEL op, ...);

阅读全文 »

Autorelease相关.md

发表于 2016-10-10 | 更新于 2019-08-01 | 分类于 重学iOS | 评论数: | 阅读次数:
本文字数: 4.4k | 阅读时长 ≈ 4 分钟

Autorelease对象什么时候释放?

在没有手加Autorelease Pool的情况下,Autorelease对象是在当前的runloop迭代结束时释放的,

而它能够释放的原因是系统在每个runloop迭代中都加入了自动释放池Push和Pop

阅读全文 »

Method-Swizzling使用

发表于 2016-10-10 | 更新于 2019-03-07 | 分类于 重学iOS , Runtime | 评论数: | 阅读次数:
本文字数: 8.1k | 阅读时长 ≈ 7 分钟

在没有一个类的实现源码的情况下,想改变其中一个方法的实现,除了继承它重写、和借助类别重名方法暴力抢先之外,还能使用Method Swizzling方法

原理

在Objective-C中调用一个方法,其实是向一个对象发送消息,查找消息的唯一依据是selector的名字。利用Objective-C的动态特性,可以实现在运行时偷换selector对应的方法实现,达到给方法挂钩的目的。

每个类都有一个方法列表,存放着selector的名字和方法实现的映射关系。IMP有点类似函数指针,指向具体的Method实现。

阅读全文 »

sqlite3-简介.md

发表于 2016-10-10 | 更新于 2019-07-31 | 分类于 重学iOS | 评论数: | 阅读次数:
本文字数: 11k | 阅读时长 ≈ 10 分钟

使用

在iOS中操作SQLite数据库可以分为以下几步(注意先在项目中导入libsqlite3框架):

  1. 添加libsqlite3.tbd
  2. 打开数据库,利用sqlite3_open()打开数据库会指定一个数据库文件保存路径,如果文件存在则直接打开,否则创建并打开。打开数据库会得到一个sqlite3类型的对象,后面需要借助这个对象进行其他操作
  3. 执行SQL语句,执行SQL语句又包括有返回值的语句和无返回值语句。
    • 对于无返回值的语句(如增加、删除、修改等)直接通过sqlite3_exec()函数执行;
    • 对于有返回值的语句则首先通过sqlite3_prepare_v2()进行sql语句评估(语法检测),然后通过sqlite3_step()依次取出查询结果的每一行数据,对于每行数据都可以通过对应的sqlite3_column_类型()方法获得对应列的数据,如此反复循环直到遍历完成。当然,最后需要释放句柄。
阅读全文 »

NSRunloop简介.md

发表于 2016-10-10 | 更新于 2019-08-01 | 分类于 重学iOS | 评论数: | 阅读次数:
本文字数: 6.5k | 阅读时长 ≈ 6 分钟

NSRunLoop是IOS消息机制的处理模式

  • NSRunLoop的主要作用:控制NSRunLoop里面线程的执行和休眠,在有事情做的时候使当前NSRunLoop控制的线程工作,没有事情做让当前NSRunLoop的控制的线程休眠。
  • NSRunLoop 就是一直在循环检测,从线程start到线程end,检测inputsource(如点击,双击等操作)同步事件,检测timesource同步事件,检测到输入源会执行处理函数,首先会产生通知,corefunction向线程添加runloop observers来监听事件,意在监听事件发生时来做处理。
阅读全文 »

NSOperation-简介.md

发表于 2016-10-10 | 更新于 2019-08-01 | 分类于 重学iOS | 评论数: | 阅读次数:
本文字数: 35k | 阅读时长 ≈ 32 分钟

NSOperation-简介

阅读全文 »

GCD相关.md

发表于 2016-10-10 | 更新于 2019-08-01 | 分类于 重学iOS | 评论数: | 阅读次数:
本文字数: 22k | 阅读时长 ≈ 20 分钟

OS X 10.8或iOS 6以及之后版本中使用,Dispatch Queue将会由ARC自动管理,不需要手动释放

队列

分为串行队列和并发队列

阅读全文 »

SDWebImage375源码-缓存机制

发表于 2016-10-10 | 更新于 2018-11-23 | 分类于 essay , SDWebImage | 评论数: | 阅读次数:
本文字数: 33k | 阅读时长 ≈ 30 分钟

存 取 删 路径

1.1 存

是在storeImage这个方法里:

将图片储存到内存和硬盘上

阅读全文 »

SDWebImage375源码-SDWebImageDecoder

发表于 2016-10-10 | 更新于 2018-11-23 | 分类于 essay , SDWebImage | 评论数: | 阅读次数:
本文字数: 469 | 阅读时长 ≈ 1 分钟

由于UIImage的imageWithData函数是每次画图的时候才将Data解压成ARGB的图像,

所以在每次画图的时候,会有一个解压操作,这样效率很低,但是只有瞬时的内存需求。

为了提高效率通过SDWebImageDecoder将包装在Data下的资源解压,然后画在另外一张图片上,这样这张新图片就不再需要重复解压了。

这种做法是典型的空间换时间的做法。

首先NSURLCache是缓存原始数据(raw data)到磁盘或内存,因此每次使用的时候需要将原始数据转换成具体的对象,如UIImage等,这会导致额外的数据解析以及内存占用等,而SDWebImage则是缓存UIImage对象在内存,缓存在NSCache中,同时直接保存压缩过的图片到磁盘中;还有一个问题是当你第一次在UIImageView中使用image对象的时候,图片的解码是在主线程中运行的!而SDWebImage会强制将解码操作放到子线程中。

以上记录下来备忘 还不是很理解怎么回事

SDWebImage375源码-叁

发表于 2016-10-10 | 更新于 2018-11-23 | 分类于 essay , SDWebImage | 评论数: | 阅读次数:
本文字数: 5.6k | 阅读时长 ≈ 5 分钟

在SDWebImage3.7.5源码阅读二中看完后,已经知道SDWebImageCombinedOperation类的在cacheOperation搜索完缓存之后:

1
2
3
4
5
6
7
8
9
10
11
12
operation.cacheOperation = [self.imageCache queryDiskCacheForKey:key done:^(UIImage *image, SDImageCacheType cacheType) {

...
operation.cacheOperation = [self.imageCache queryDiskCacheForKey:key done:^(UIImage *image, SDImageCacheType cacheType) {

...//一大串 options的操作 暂时不管它

//终于见到了下载操作!
id <SDWebImageOperation> subOperation = [self.imageDownloader downloadImageWithURL:url options:downloaderOptions progress:progressBlock completed
...

}
阅读全文 »
<i class="fa fa-angle-left" aria-label="上一页"></i>1…789<i class="fa fa-angle-right" aria-label="下一页"></i>
SunTongSheng

SunTongSheng

移动端 前端 跨平台

85 日志
22 分类
27 标签
RSS
© 2026 SunTongSheng | 532k | 8:04