
ios开发
文章平均质量分 83
slunlun
这个作者很懒,什么都没留下…
展开
-
APP Launch 优化
本文将探讨一下对于APP Launch的相关概念以及影响Launch的因素及优化方法。原创 2021-12-14 16:52:21 · 3321 阅读 · 0 评论 -
GCD常用函数拾遗
目录dispatch_block_t这几天偶尔又回顾了下GCD的知识。之前我一直以为自己对于GCD已经大体有个整体掌握了,却发现仍还有一些知识点的遗漏。于是写在这里,算是对之前GCD常用函数文章的补充。dispatch_block_t在GCD中,所有的任务,都是封装成block的形式进行派发的。比如void dispatch_async(dispatch_queue_t queue, dispatch_block_t block);dispatch_async的第二个参数,就是一个的block。原创 2020-08-21 16:48:08 · 1155 阅读 · 0 评论 -
Objective-C runtime机制(4)——深入理解Category
在平日编程中或阅读第三方代码时,category可以说是无处不在。category也可以说是OC作为一门动态语言的一大特色。category为我们动态扩展类的功能提供了可能,或者我们也可以把一个庞大的类进行功能分解,按照category进行组织。关于category的使用无需多言,今天我们来深入了解一下,category是如何在runtime中实现的。category的数据结构cate...原创 2018-06-11 15:21:24 · 2745 阅读 · 1 评论 -
Objective-C runtime机制(11)——结业考试
试分析如下代码#import <UIKit/UIKit.h>@interface Student : NSObject@property(nonatomic, strong) NSString *name;@property(nonatomic, strong) NSNumber *age;@end@interface Sark : NSObject@propert...原创 2019-12-31 11:46:31 · 1693 阅读 · 5 评论 -
《iOS Drawing Practical UIKit Solutions》读书笔记(四) —— 遮罩,模糊和动画
遮罩,模糊和动画会为我们的APP增色不少,现在,就让我们了解一下吧。用Blocks绘制Images利用下面工具函数,可以简化创建image的过程。typedef void(^DrawingStateBlock)();UIImage * DrawIntoImage(CGSize size, DrawingStateBlock block) { UIGraphicsBeg...原创 2018-03-24 17:11:04 · 676 阅读 · 0 评论 -
iOS RunLoop完全指南
提起RunLoop,相信每个iOS开发都或多或少的听过,面试时也会经常作为压箱底的问题来问。之前写过RunLoop相关的内容,但是那时写的太浅,基本都是照着苹果文档的翻译。今天,就重新深入了解一下RunLoop。什么是RunLoop概念什么是RunLoop,顾名思义,RunLoop就是在‘跑圈’,其代码本质是一个do while循环。 RunLoop位于苹果的Core Found...原创 2018-05-16 23:02:21 · 12740 阅读 · 3 评论 -
Objective-C runtime机制(前传2)——Mach-O格式和runtime
在前传1中,我们分析了解了XNU内核所支持的二进制文件格式Mach-O。同时还留了一个小尾巴,就是Mach-O文件中和Objective-C以及runtime相关的Segment section。今天,就来了解一下它们。OC之源起我们知道,程序的入口点在iOS中被称之为main函数:#import <UIKit/UIKit.h>#import &am原创 2018-05-25 16:20:55 · 2624 阅读 · 0 评论 -
Objective-C runtime机制(前传)——Mach-O格式
Mach-OMach-O是Mach Object文件格式的缩写。它是用于可执行文件,动态库,目标代码的文件格式。作为a.out格式的替代,Mach-O格式提供了更强的扩展性,以及更快的符号表信息访问速度。Mach-O格式为大部分基于Mach内核的操作系统所使用的,包括NeXTSTEP, Mac OS X和iOS,它们都以Mach-O格式作为其可执行文件,动态库,目标代码的文件格式。具体...原创 2018-05-21 22:28:50 · 3527 阅读 · 2 评论 -
Objective-C runtime机制(2)——消息机制
当我们用中括号[]调用OC函数的时候,实际上会进入消息发送和消息转发流程: 消息发送(Messaging),runtime系统会根据SEL查找对用的IMP,查找到,则调用函数指针进行方法调用;若查找不到,则进入消息转发流程,如果消息转发失败,则程序crash并记录日志。SELSEL被称之为消息选择器,它相当于一个key,在类的消息列表中,可以根据这个key,来查找到对应的消息实现...原创 2018-06-04 18:04:48 · 3429 阅读 · 3 评论 -
《iOS Drawing Practical UIKit Solutions》读书笔记(四) —— Path Basics
贝瑟尔曲线贝瑟尔曲线是在绘制路径时,常用的方式。通过贝瑟尔曲线,我们可以绘制常规的矩形,椭圆,或弧线。同时,通过二次,三次贝瑟尔曲线,我们还可以绘制更加复杂的曲线。现在,我们就一起来看一下,贝尔瑟尔曲线在iOS绘图中的应用。UIBezierPathUIBezierPath是iOS中提供的贝瑟尔曲线类,它提供了简便的方法调用,来创建矩形、椭圆、圆角矩形以及弧线。Rectang...原创 2018-03-20 15:26:00 · 332 阅读 · 0 评论 -
《iOS Drawing Practical UIKit Solutions》读书笔记(三) —— Drawing Images
UIKit ImagesUIKit提供了许多函数可以让我们操作Image,甚至我们可以仅通过代码的方式,获取一个UIImage。UIImage *SwatchWithColor(UIColor *color, CGFloat side) { UIGraphicsBeginImageContextWithOptions(CGSizeMake(side, side), YES, 0...原创 2018-03-14 11:20:48 · 539 阅读 · 0 评论 -
《iOS Drawing Practical UIKit Solutions》读书笔记(二) —— The Language of Geometry
Points VS PixelsPoint是UIKit中的逻辑位置,并不代表像素。主要是在Retina屏幕中,一个Point会对应2或3个Pixels,这取决于PPI(DPI):pixel per inch ,像素密度PPI,指每英尺的像素数,表示了清晰度。ScaleUIScreen类的属性scale, 表明了当前设备点与像素间的关系。因此,对于非Retain屏,scale =...原创 2018-03-09 10:28:37 · 373 阅读 · 0 评论 -
《iOS Drawing Practical UIKit Solutions》读书笔记(一)——Drawing Context
FrameworksiOS 绘图基于两个库: 1. UIKit 2. Quartz 2DUIKit我们很熟悉,常用的控件UIView,UIButton以及各种ViewController,均来自于UIKit库。Quartz 2D则是基于C语音的绘图库,我们应该听说过,但是真正应用的并不多。Quartz 2D的底层实现是基于Core Graphics的。因此Quartz的一些数据类型...原创 2018-03-07 10:49:32 · 647 阅读 · 0 评论 -
设计模式深入浅出(六)对象去耦——中介者
对象去耦我们的程序中,一般不会只有一个类,而通常是有多个类互相合作。既然提到互相合作,那么类对象间的耦合性是不可避免的。但是我们需要控制耦合的程度,将类的实现及关系控制在可以灵活改变的程度。当我们发现我们的代码,牵一发而动全身的时候,有两个可能: 1. 类封装的不合理,不符合职责单一原则 2. 类之间的组织方式不合理,需要对象去耦。而这,就需要对象去耦模式。对象去耦主要包括两种模式:中介者,观察原创 2017-10-15 00:18:32 · 423 阅读 · 0 评论 -
设计模式深入浅出(五)接口适配——外观
我要去旅游大家都很喜欢去旅游,前段时间十一各地都是人山人海,于是我们想到了出国旅游。 旅游分为两种:1. 自由行 2.跟团游 1. 自由行:所有的事情都是亲力亲为,以出国游为例,我们需要自己跑到大使馆去签证,去银行兑换外币,定旅店等。虽然麻烦,但是逍遥自在。 2. 跟团游:无需你做任何事情,只要交钱,剩下的签证,旅馆预订等都有旅游社联系,搞定。方便,快捷。程序中的“旅行社”上面旅游的例子中,你原创 2017-10-12 23:33:46 · 470 阅读 · 0 评论 -
设计模式深入浅出(四)接口适配——适配器
适配器模式可以说是一个典型的接口适配模式。一个现实中的例子现在让我设想这么一个问题,如何让别人写好的已有的类接口,无缝的融合到我们自己的工程中?前提是,你无法获取到别人的源代码,也就是你不能够修改别人的代码。举一个我们APP中的例子: 我们的APP是一款类似于云盘文件管理系统的软件。它能够接入GoogleDrive,OneDrive,Dropbox等第三方云盘系统。原创 2017-10-12 21:50:16 · 1398 阅读 · 0 评论 -
设计模式深入浅出(三)接口适配——桥接
OK,通过前两章,我们一起看了创建型模式。现在进入接口适配类型模式。所谓接口适配,就是将不兼容的接口,能够共同合作,同时合理的控制其耦合度。现在介绍第一个接口适配模式,桥接。原创 2017-10-07 23:54:32 · 1420 阅读 · 0 评论 -
Objective-C runtime机制(1)——基本数据结构:objc_object & objc_class
前言从本篇文章开始,就进入runtime的正篇。什么是runtime?OC是一门动态语言,与C++这种静态语言不同,静态语言的各种数据结构在编译期已经决定了,不能够被修改。而动态语言却可以使我们在程序运行期,动态的修改一个类的结构,如修改方法实现,绑定实例变量等。 OC作为动态语言,它总会想办法将静态语言在编译期决定的事情,推迟到运行期来做。所以,仅有编译器是不够的,它需要...原创 2018-05-30 10:06:22 · 7461 阅读 · 3 评论 -
Objective-C runtime机制(3)——method swizzling
方法替换,又称为method swizzling,是一个比较著名的runtime黑魔法。网上有很多的实现,我们这里直接讲最正规的实现方式以及其背后的原理。Method Swizzling在进行方法替换前,我们要考虑两种情况:要替换的方法在target class中有实现要替换的方法在target class中没有实现,而是在其父类中实现对于第一种情况,很简单,我们直接调用me...原创 2018-06-06 18:18:48 · 1965 阅读 · 1 评论 -
Objective-C runtime机制(10)——KVO的实现机制
使用KVO自动触发KVO在平日代码中,我们通过KVO来监视实例某个属性的变化。比如,我们要监视Student 的 age属性,可以这么做:@interface Student : NSObject@property(nonatomic, strong) NSString *name;@end@interface ViewController ()@end@implement...原创 2019-02-21 17:33:56 · 1826 阅读 · 1 评论 -
Block背后的数据结构及变量截取
本文的内容主要是基于Clang编译器的官方文档所写。Clang先说些题外话,什么是Clang?Clang是C++编写的编译器。我们知道,我们平常代码所写的任何程序,最终都需要通过编译器转换成与语言无关的机器二进制代码。而Clang,则是支持/C++/Objective-C/Objective-C++的编译器。那我们在做OC开发时,可能也会听说LLVM编译器,那么Clang和LLVM之间是什么关...原创 2019-02-15 17:35:43 · 1702 阅读 · 2 评论 -
Objective-C runtime机制(8)——OC对象从创建到销毁
在我们前面的几章中,分析了OC的runtime一些底层的数据结构以及实现机制。今天,我们就从一个OC对象的生命周期的角度,来解析在runtime底层是如何实现的。我们创建一个对象(或对象引用)有几种方式?Student *student = [[Student alloc] init];Student *student2 = [Student new];__weak Student *w...原创 2019-01-22 15:04:12 · 3512 阅读 · 0 评论 -
Objective-C runtime机制(9)——main函数前发生了什么
在我们的App代码中,程序的入口点是int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); }}而对于runtime来说,其入口函数是vo...原创 2019-01-25 15:35:48 · 2914 阅读 · 0 评论 -
iOS应用组件化/模块化探究
组件化是近几年流行起的概念,它是当代码扩张到一定程度时,所采取的一种代码组织架构策略。淘宝、蘑菇街等大厂也在近几年陆续完成了其代码组件化的过程。提到组件化,给人的感觉似乎很高大上,很神秘的感觉。但是,正如大多数真正优秀的架构一样,组件化的代码实现并不是很困难,正所谓大道无形,组件化真正的难点并不在于代码的实现,而是如何应用组件化的思想,将现有的工程拆分成一个个组件。本文主要在Casa大神的文章...原创 2019-01-09 14:48:35 · 5023 阅读 · 1 评论 -
AFNetWorking(3.0)源码分析(五)——AFHTTPRequestSerializer & AFHTTPResponseSerializer
在前面的几篇博客中,我们分析了AFURLSessionMangerd以及它的子类AFHTTPSessionManager。我们对AF的主要两个类,有了一个比较全面的了解。对于AFHTTPSessionManager,当其在要发送请求时,会调用AFHTTPRequestSerializer 来组装请求。 而当请求获得了响应,需要作出解析时,又会调用对应的response serializer来解析...原创 2018-11-21 15:50:29 · 3032 阅读 · 0 评论 -
AFNetWorking(3.0)源码分析(四)——AFHTTPSessionManager(2)
在上一篇博客中,我们分析了AFHTTPSessionManager,以及它是如何实现GET/HEAD/PATCH/DELETE相关接口的。我们还剩下POST相关接口没有分析,在这篇博客里面,我们就来分析一下POST相关接口是如何实现的。multipart/form-data请求在继续理解POST接口之前,我们先来了解一下HTTP协议中和POST相关的multipart/form-data请求...原创 2018-11-09 15:04:58 · 1065 阅读 · 0 评论 -
AFNetWorking(3.0)源码分析(三)——AFHTTPSessionManager(1)
关于AFNetWorking的源码分析已经断更了2年有余,现在来填坑了~AFURLSessionManager & AFHTTPSessionManager在我们访问网站时,可以想象做是我们在与远方的服务器进行“会话(Session)”。我们通过规定好的协议(如HTTP),告诉服务器,我们需要查询(GET)什么,我们要提交(POST)什么,我们要修改(PUT)什么,我们要删除(DELE...原创 2018-11-06 16:54:52 · 1607 阅读 · 0 评论 -
Objective-C runtime机制(7)——SideTables, SideTable, weak_table, weak_entry_t
在runtime中,有四个数据结构非常重要,分别是SideTables,SideTable,weak_table_t和weak_entry_t。它们和对象的引用计数,以及weak引用相关。关系先说一下这四个数据结构的关系。 在runtime内存空间中,SideTables是一个64个元素长度的hash数组,里面存储了SideTable。SideTables的hash键值就是一个对象obj的ad...原创 2018-10-11 18:04:40 · 13799 阅读 · 2 评论 -
Objective-C runtime机制(6)——weak引用的底层实现原理
前言提起弱引用,大家都知道它的作用:(1)不会添加引用计数 (2)当所引用的对象释放后,引用者的指针自动置为nil那么,围绕它背后的实现,是怎么样的呢?在许多公司面试时,都会问到这个问题。那么,今天就带大家一起分析一下weak引用是怎么实现的,希望能够搞清楚每一个细节。Store as weak当我们要weak引用一个对象,我们可以这么做:int main(int argc, char...原创 2018-09-20 15:45:15 · 6157 阅读 · 0 评论 -
GCD源码吐血分析(2)——dispatch_async/dispatch_sync/dispatch_once/dispatch group
上一章中,我们知道了获取GCD queue的底层实现。获取到queue后,就需要将任务提交到queue中进行处理。 我们有两种方式提交任务: dispatch_async和dispatch_sync。一个是异步不等待任务完成就返回,另一个是同步任务,需要等待任务完成。这两种提交任务的方式有所不同:dispatch_async :底层运用了线程池,会在和当前线程不同的线程上处理任务。di...原创 2018-07-30 17:47:41 · 7917 阅读 · 5 评论 -
GCD源码吐血分析(1)——GCD Queue
看了快半个月的GCD源码,只能说太变态了。 先来吐槽一下:一个函数,调用栈都是十几层…… 为了效率,代码使用了纯C语言,但是为了模拟面向对象中的继承,虚函数等,定义了一层层的宏定义,看一个struct的定义要绕过来绕过去…… 网上的资料极少,有的那几篇,还都是用旧版本的GCD在说事儿,在新版的GCD源码复杂度及晦涩度,真是简直了……说实话,到现在也不敢说是看懂了或是看对了,所以这篇博客只是个...原创 2018-07-16 17:03:50 · 5866 阅读 · 0 评论 -
Objective-C runtime机制(5)——iOS 内存管理
概述当我们创建一个对象时:SWHunter *hunter = [[SWHunter alloc] init];上面这行代码在栈上创建了hunter指针,并在堆上创建了一个SWHunter对象。目前,iOS并不支持在栈上创建对象。iOS 内存分区iOS的内存管理是基于虚拟内存的。虚拟内存能够让每一个进程都能够在逻辑上“独占”整个设备的内存。关于虚拟内存,可以参考这里。iOS...原创 2018-06-25 14:54:33 · 8255 阅读 · 16 评论 -
设计模式深入浅出(二)对象创建——Builder,原型,单例
BuilderBuilder模式,顾名思义,建造者。这个模式让我想到了前一段时间的装修。现在的装修工程一般是这样配置的:有一个项目经理,全权由他负责及调度手下的泥工,电工,木工,油漆工的工作。整个装修阶段,泥工,电工等工种会轮流(反复)进场或中间有些交叉,比如,房间铺设电线,需要电工在墙上,地上先开槽,再铺线,当电工做完电线铺设后,需要将开槽回填,这时候需要泥工进场。而当泥工铺好瓷砖等之后原创 2017-10-04 00:14:29 · 591 阅读 · 0 评论 -
设计模式深入浅出(一)对象创建——工厂方法,抽象工厂
说实话,本人写的设计模式系列博客,也只是依照我目前浅薄的见解来写的,并不能保证完全的正确,也希望大家有不同的想法,可以提出共同探讨。首先我们提到设计模式总是会有一种高大上的感觉,其实设计模式并不是那么高冷,也许我们平常已在不觉总用到了若干设计模式,只是不知道其名字而已。那么什么是设计模式呢?用通俗的话来讲,就是用面向对象的思想来解决日常遇到的问题。原创 2017-10-02 00:25:26 · 715 阅读 · 0 评论 -
IOS Core Data框架初探
在IOS系统中已经集成了关系型数据库SqLite3数据库,但是由于在OC中直接操作C语言风格的SqLite3相对繁琐,因此Apple贴心的提供了一个ORM(Object Relational Mapping对象关系映射)框架——Core Data让我们在程序中以面向对象的方式,操作数据库。Core Data框架提供的功能相当强大,属于入门容易精通难的东西,值得我们用心专研。现在,就先记录一下我对该原创 2015-08-18 14:37:33 · 836 阅读 · 0 评论 -
OC中属性self.a与_a访问的区别
在OC中我们可以通过指令@property定义属性。OC对属性封装了许多方法,同时也会自动实现一些方法,相比实例变量,感觉更加面向对象些。一般定义属性的方法如下,在Class Test中定义属性int a。@interface Test:NSObject@property int a;-(void) changeAValue:(int) newValue;@end在类的实例方原创 2015-03-11 16:39:51 · 3115 阅读 · 1 评论 -
IOS事件处理编程指南(一)——概要
在IOS设备中,我们能够处理多种事件。IOS将事件分为了如下三种:MultiTouch events,Motion events,和Remote control events。被UIKit简化的事件处理不用多说,UIKit框架为我们封装并实现了一些常用事件,同时,我们也可以通过重写touch系列响应函数,或为View添加系统定义好的或我们自定义的Gesture Recongize来原创 2015-08-16 16:27:01 · 876 阅读 · 0 评论 -
IOS View编程指南笔记
我们所看到的程序对于一切IOS APP来说,我们看的的内容,都是UIView所呈现的。UIView如场景,UIWindow如舞台,UIView粉墨登场在UIWindow这个舞台上,使我们看到丰富多彩的界面UI。UIWindow本身没有任何内容,它只提供了一个场所来让这些UIView来显示,切换。原创 2015-08-16 15:26:34 · 1192 阅读 · 0 评论 -
IOS并发编程——Grand Center Dispatch
并发编程往往能够提高程序的效率,在其他平台中进行并发编程往往就是多线程的编程,在IOS中同样可以进行多线程编程,但是Apple的官方文档却告诉我们,尽量不要使用原生线程,而是使用其他替代技术。为什么呢?有如下几点理由:1、原生线程编程往往需要涉及同步,线程资源获取释放等操作,相对复杂。2、原生多线程编程线程切换运行由人为控制,不如直接交给操作系统来管理线程效率高(操作系统会根据系统实时状况灵活操作多线程)。3、每一次对原生线程的操作,都要进行内核层的操作。而内核层操作花费时间大。而由操作系统代劳原创 2015-07-06 20:48:49 · 1121 阅读 · 0 评论 -
IOS界面开发基础——Frame与Bounds
参考资料:http://blog.youkuaiyun.com/hherima/article/details/39501857在IOS的UI开发中,经常需要对view进行定位。比较常用的概念就是Frame和Bound,通过view这两个属性,就可以任意的“摆弄”我们的view了。这两个属性都可以定义view的位置和大小,但这两个属性之间有什么区别和联系呢?经过资料查找,记录如下:Fram原创 2015-05-21 20:47:45 · 1022 阅读 · 0 评论