jacky's blog

宁静致远


  • 首页

  • 归档

  • 标签

AutoreleasePool底层实现原理

发表于 2018-05-23 |
AutoreleasePool(自动释放池)是OC中的一种内存自动回收机制,它可以延迟加入AutoreleasePool中的变量release的时机。在正常情况下,创建的变量会在超出其作用域的时候release,但是如果将变量加入AutoreleasePool,那么release将延迟执行。 AutoreleasePool创建和释放 App启动后,苹果在主线程 RunLoop 里注册了两个 Observer,其回调都是 _wrapRunLoopWithAutoreleasePoolHandler()。 第一个 Observer 监视的事件是 Entry(即将进入Loop),其回调内会调用 _objc_autoreleasePoolPush() 创建自动释放池。其 order 是-214 ...
阅读全文 »

NSDictionary底层实现原理

发表于 2018-05-23 |
NSDictionary介绍 NSDictionary(字典)是使用 hash表来实现key和value之间的映射和存储的, hash函数设计的好坏影响着数据的查找访问效率。数据在hash表中分布的越均匀,其访问效率越高。而在Objective-C中,通常都是利用NSString 来作为键值,其内部使用的hash函数也是通过使用 NSString对象作为键值来保证数据的各个节点在hash表中均匀分布。 NSDictionary内部结构NSDictionary使用NSMapTable实现,NSMapTable同样是一个key-value的容器。 12345typedef struct { NSMapTable *table; NSInteger ...
阅读全文 »

HTTP和HTTPS详解

发表于 2018-05-11 |
计算机通信原理互联网的关键技术就是TCP/IP协议。两台计算机之间的通信是通过TCP/IP协议在因特网上进行的。实际上这个是两个协议: TCP: Transmission Control Protocol 传输控制协议 IP: Internet Protocol 网际协议。 引自维基百科TCP/IP协议族是一个网络通信模型,以及一整个网络传输协议家族,为互联网的基础通信架构。该协议家族的两个核心协议:TCP(传输控制协议)和IP(网际协议),为该家族中最早通过的标准。这个协议族由互联网工程任务组负责维护。 TCP: 应用程序之间的通信TCP确保数据包以正确的次序到达,并且尝试确认数据包的内容没有改变。TCP在IP地址之上引端口(port),它允许计算机通过网络提供各种服务。一些端 ...
阅读全文 »

iOS KVC和KVO详解

发表于 2018-05-08 |
KVCKVC定义 KVC(Key-value coding)键值编码,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值。而不需要调用明确的存取方法。这样就可以在运行时动态地访问和修改对象的属性。而不是在编译时确定,这也是iOS开发中的黑魔法之一。很多高级的iOS开发技巧都是基于KVC实现的。 在实现了访问器方法的类中,使用点语法和KVC访问对象其实差别不大,二者可以任意混用。但是没有访问起方法的类中,点语法无法使用,这时KVC就有优势了。 KVC的定义都是对NSObject的扩展来实现的,Objective-C中有个显式的NSKeyValueCoding类别名,所以对于所有继承了NSObject的类型,都能使用KVC(一些纯Swift类和结构体是不 ...
阅读全文 »

iOS RunLoop详解

发表于 2018-04-10 |
Runloop 是和线程紧密相关的一个基础组件,是很多线程有关功能的幕后功臣。尽管在平常使用中几乎不太会直接用到,理解 Runloop 有利于我们更加深入地理解 iOS 的多线程模型。 本文从如下几个方面理解RunLoop的相关知识点。 RunLoop概念 RunLoop实现 RunLoop运行 RunLoop应用 RunLoop概念RunLoop介绍 RunLoop 是什么?RunLoop 还是比较顾名思义的一个东西,说白了就是一种循环,只不过它这种循环比较高级。一般的 while 循环会导致 CPU 进入忙等待状态,而 RunLoop 则是一种“闲”等待,这部分可以类比 Linux 下的 epoll。当没有事件时,RunLoop 会进入休眠状态,有事件发生时, RunLoop 会去 ...
阅读全文 »

iOS Runtime详解

发表于 2018-04-01 |
Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发,具体怎么实现的呢。我们从下面几个方面探寻Runtime的实现机制。 Runtime介绍 Runtime消息传递 Runtime消息转发 Runtime应用 Runtime介绍 Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制。而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库。它是 Objective-C 面向对象和动态机制的基石。 Objective-C 是一个动态语言,这意味着它不仅需要一个编译器,也需要一个运行时系统来动态得创建类和对象、进行消息传递和转发。理解 Objective-C 的 Runtime 机制可以帮我们更 ...
阅读全文 »

iOS内存管理详解

发表于 2018-04-01 |
从上图可以看到,栈里面存放的是值类型,堆里面存放的是对象类型。对象的引用计数是在堆内存中操作的。下面我们讲讲堆和栈怎么存放和操作数据, 还有MRC和ARC怎么管理引用计数。 Heap(堆)和stack(栈)堆是什么 引自维基百科堆)(英语:Heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。堆即为解决此类问题设计的一种数据结构。 堆(Heap)又被为优先队列(priority queue)。尽管名为优先队列,但堆并不是队列。回忆一下,在队列中,我们可以进行的限定操作是dequeue和enque ...
阅读全文 »

iOS多线程详解:实践篇

发表于 2018-03-23 |
iOS多线程实践中,常用的就是子线程执行耗时操作,然后回到主线程刷新UI。在iOS中每个进程启动后都会建立一个主线程(UI线程),这个线程是其他线程的父线程。由于在iOS中除了主线程,其他子线程是独立于Cocoa Touch的,所以只有主线程可以更新UI界面。iOS多线程开发实践方式有4种,分别为Pthreads、NSThread、GCD、NSOperation,下面分别讲一讲各自的使用方式,以及优缺点。 pthread: 跨平台,适用于多种操作系统,可移植性强,是一套纯C语言的通用API,且线程的生命周期需要程序员自己管理,使用难度较大,所以在实际开发中通常不使用。NSThread: 基于OC语言的API,使得其简单易用,面向对象操作。线程的声明周期由程序员管理,在实际开发中偶尔使用。 ...
阅读全文 »

iOS多线程详解:概念篇

发表于 2018-03-23 |
讲多线程这个话题,就免不了先了解多线程相关的技术概念。本文涉及到的技术概念有CPU、进程、线程、同异步、队列等概念。也可能讲的不全或者不足的地方,后续再加以补充,最近一直使用Swift进行开发,本文所有代码例子都会Swift4进行演示。 CPUCPU是什么 引自维基百科CPU中央处理器 (英语:Central Processing Unit,缩写:CPU),是计算机的主要设备之一,功能主要是解释计算机指令以及处理计算机软件中的数据。 计算机的可编程性主要是指对中央处理器的编程。 中央处理器、内部存储器和输入/输出设备是现代电脑的三大核心部件。 1970年代以前,中央处理器由多个独立单元构成,后来发展出由集成电路制造的中央处理器,这些高度收缩的组件就是所谓的微处理器,其中分出的中央处理器最为 ...
阅读全文 »

iOS通过SSH远程管理macOS服务器文件

发表于 2018-03-23 |
以前写过一个iOS客户端播放视频的App,我在macOS搭建了web服务器实现目录浏览功能,把下载的视频资源放到web服务器的目录,这样iOS客户端可以通过webview获取到macOS服务端的视频资源的链接了,从而实现iOS上播放电脑上视频资源的功能。但是用久了之后,发现我看完的电影资源还在那里,每次看视频去找新的没看过的就很麻烦。这样就想能不能写个程序,当我看完这个电影之后,直接删掉这个资源,或者把这个资源移动到其他收藏目录。通过这个想法,找了一些实现方法,感觉还是使用ssh去做比较快和方便。 使用分析blink本文ssh的功能主要是通过开源工具blink实现,窗口实现的逻辑大部分在TermController里面 创建终端显示器12345678- (void)createPTY& ...
阅读全文 »
123…6
jacky

jacky

51 日志
3 分类
20 标签
简书 掘金 GitHub
© 2019 jacky
由 Hexo 强力驱动
主题 - NexT.Pisces