- 博客(72)
- 资源 (13)
- 收藏
- 关注
原创 指定初始化和便利初始化
1,指定初始化方法必须调用父类的指定初始化方法(通过super的方式),NSObject是所有类的根类,其指定初始化方法是init。2,类的便利初始化方法必须调用类的其他指定初始化方法。3,类实现了指定初始化方法,必须实现(覆盖实现)父类的所有指定初始化方法.........................................................
2022-07-13 20:13:18
534
原创 Xcode的诊断配置
Xcode的scheme配置中,有个Diagnostics栏目,其中有很多内存相关的配置,用来帮助开发者定位内存问题。常用的功能有这些。Address SanitizerGuard MallocZombie ObjectsMalloc ScribbleMaloc Guard EdgesMalloc Stack LoggingAddress Sanitizer,地址消毒剂Guard MallocMalloc Scribble,将分配的内存填充0xAA(通过malloc调用的,calloc不会填
2022-07-07 10:53:54
1054
原创 Flutter小记
1 三种树Flutter的UI系统包含三棵树:Widget树、Element树、渲染树。他们的依赖关系是:Element树根据Widget树生成,而渲染树又依赖于Element树。Widget有个createElement方法,返回一个Element对象。Element有个renderObject方法,返回一个RenderObject对象。2 加载过程现在我们重点看一下Element,Element的生命周期如下:1、Framework 调用Widget.createElement 创建一个El
2022-03-02 17:24:31
1775
原创 内存的分段与分页
虚拟地址经过内存管理单元处理(MMU)成物理地址,然后再访问。经过段内存管理单元处理变成线性地址,再经过页内存管理单元处理变成物理地址。但目前的系统实际上只存在分页,而不存在分段。常见的cs代码段,ds数据段,ss堆栈段,es拓展段等等这些段表面上是存在的,里面也是有值的,但是其段选择子对应的基址却是0。相当于不分段。分页的具体流程是什么样呢?以32位系统为例,一般采用2级分页形式。即页目录项和页表项再到具体的页。...
2022-02-21 19:48:59
541
原创 iOS的仿射的一点理解
1 CGAffineTransform定义如下:struct CGAffineTransform { CGFloat a, b, c, d; CGFloat tx, ty;};这只定义了部分数据,这个其实是一个3*3的矩阵,最后一列永远是[0,0,1]。/* Return a transform which translates by `(tx, ty)': t' = [ 1 0 0 1 tx ty ] */CGAffineTransform CGAffineTransfo
2022-01-11 15:03:03
1327
原创 mac OS与iOS的系统调用
mac OS 上 x86 使用syscall,32位 int 0x80。中断号定义在#import <sys/syscall.h>syscall_sw.h调用分#define SYSCALL_CLASS_NONE 0 /* Invalid /#define SYSCALL_CLASS_MACH 1 / Mach / #define SYSCALL_CLASS_UNIX 2 / Unix/BSD /#define SYSCALL_CLASS_MDEP 3 / Machine-depe
2021-11-08 19:57:54
2686
原创 Aspects源码分析
Aspects是一个用来切片编程的开源框架,提供了丰富接口,可以Hook类和单个对象的方法,并提供了原实现前Hook,替换原实现,原实现后Hook等选项。1 实现流程不管是Hook类的还是Hook某个对象的,基本流程都是将原SEL指向objc_msgForward,使其走消息转发的流程,然后将原实现保存在aliseSEL中。然后将forwardInnovation的实现设为自定义的方法,如果原来有forwardInnovation的实现,则将其保存在AspectsForwardInvocationSel
2021-10-29 16:13:27
212
原创 WKWebView小记
1 额外的进程WKWebView有额外的2个进程,Networking和Render。所以性能较好,且内存占用低。2 遇到的坑坑1 打卡新网页不支持_blank,_blank用来打开一个新的网页,但WKWebView下却点击无反应。需要进行特殊处理,-(WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigatio
2021-10-29 16:03:15
458
原创 进程与线程
进程三个状态:就绪Ready,运行 Runing,阻塞 Suspend。就绪代表资源都已经准备好,只待CPU执行,阻塞表示需要获取资源导致当前无法继续执行而被挂起。进程是资源分配的基本单位,而线程是CPU调度和执行的基本单位。进程创建后会分配进程控制块(PCB)包含以下信息1,进程描述信息:进程标示符(pid),用户标示符(uid)2,进程控制和管理信息:进程状态,进程优先级3,资源分配信息:内存地址空间、文件列表4,CPU相关信息:寄存器的值,页表信息通常PCB是以链表的方式进行管理,把具有
2021-10-13 21:54:45
114
原创 跨端技术谈
目前流行的跨端方案按实现形式可分为三种1,通用WebView2,React Native3,Flutter1.通用WebView2.React Native使用JavaScriptCore引擎进行前端和OC Native进行交互,将前端的语言实现转换为端内的代码(RC开头的类)来进行实现,最终使用Native的渲染,渲染性能比通用WebView好些。由于中间多了一个转换的过程,对性能会有一定的影响。而且涉及到前端到Native的代码转换,当Native版本升级时,需要适配改动。3.Flutte
2021-10-07 16:30:59
459
原创 UIView和CALayer
1 两者关系两者互相依赖,UIView是管理CALayer,而CALyer则展示和绘制内容,UIView继承自UIResponder,可以响应和处理事件。UIView的很多属性和CALyer是共用的,比如UIView的alpha和CALayer的opacty。有些则会相互影响,比如CALayer的anchorPoint,会影响UIView的frame。内容的绘制UIView是CALayer的delgate,通常情况下不参与内容绘制,CALayerDelegate有以下可选方法:@protocol
2021-07-23 10:48:40
851
原创 RunLoop的一些理解
1.Runloop与dispatch的关系1.在__CFRunLoopRun函数中,用dispatch_source_create创建一个定时器。处理此次runLoop mode的运行时间,唤醒Runloop2.使用dispatch的任务,例如dispatch_async 提交的任务dispatch_after 提交的延时任务dispatch_source_createdispatch_source_set_timerdispatch_source_set_event_handler设置的
2021-05-05 09:42:05
1067
2
原创 TaggedPointer
64位系统才会有TaggedPointer功能,本意是为了减小内存浪费,提升性能。TaggedPointer的相关参数的初始化是在libobjc库的_read_images中进行的。 if (DisableTaggedPointers) { disableTaggedPointers(); } initializeTaggedPointerObfuscator();initializeTaggedPointerO
2020-05-28 20:13:11
442
原创 super 方法调用
1我们是通过[super somemethod]来调用父类方法的。在调用的父类方法中,self还是子类的对象。也可以通过objc_msgSendSuper这种方式来调用父类方法,传入一个struct objc_super 结构体参数。objc_msgSendSuper2和objc_msgSendSuper前者是私用的,只能由系统转化,即将[super somemethod]转化为objc_msgSendSuper2。后者是公开的,可以手动调用。2参数有所不同手动调用[super method]时
2020-05-28 20:12:19
1149
原创 CoreText小结
1 Line 每一行Run 每一行的具体绘制单元,相同属性的为一个Run,特殊情况是即便属性相同,但中英文不会为同一个Run2 相关函数1获取frame的所有lineCFArrayRef CTFrameGetLines( CTFrameRef frame )获取所有line的位置void CTFrameGetLineOrigins( CTFrameRef frame, CFRange range, CGPoint origins[_Nonnull] )2
2020-05-28 20:11:38
433
原创 Block小结
一直使用Block,却没有认真研究过,做个总结吧block的实质就是匿名函数,通过函数指针的调用来实现的,并对内部的引用到的数据进行管理(retain/release),封装后成为block,最终变成对象。1.Block结构 void (^block)(void) = ^(void) { printf("hello world"); };通过clang -rew...
2020-03-09 21:29:13
295
原创 Map和Dictionary
NSMutableDictionary会对key进行强引用,对value进行copy,key必须有copyWithZone方法。NSMapTable可以灵活配置key和value的内存管理方法,更多类型见NSPointerFunctionsOptions枚举值[NSMutableDictionary dictionary]等同于[NSMapTable mapTableWithKeyOp...
2019-04-22 11:43:48
2049
原创 结构体的大小
1结构体所占空间的大小,并不是简单地将结构体内所有数据元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何变量的访问都可以从任何地址开始访问,实际上,为了提高存取速度,会进行字节对齐。这就需要各类型数据按照一定的规则在空间上排列,而不是顺序地一个接一个地排放。比如有些平台每次读都是从偶地址开始,一个int型(假设为32位)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如
2016-06-19 21:28:49
677
原创 UICollectionView的使用(一)
在iOS开发中,与列表展示相关的,更多的是使用UITableView,几乎每个App都离不开它。对比与UITableView,UICollectionView的使用比较繁琐,所以UICollectionView的使用不是很常见。但UICollectionView也有自身的特点,比如横向布局,多行或者多列(瀑布流)展示。Apple也推荐了一些应用UICollectionView典型场景–相册、书库。1
2016-03-01 18:17:48
739
原创 iOS应用内语言切换功能
当我们的应用仅仅面向国内用户群,一般仅支持一种语言–中文就可以了。当面向国外用户时就需要进行国际化了,不仅仅是语言的转变,也可能包括设计风格,页面布局、交互效果的转变,如微信,微博,QQ这类应用都有着切换语言的功能。iOS常用的国际化流程1.建立strings文件。2.在Localization勾选支持的语言,在不同的后缀的同文件名的strings中设置标题。3.使用NSLocalizedStrin
2016-01-27 15:26:40
1759
原创 图像Exif Orientation
图像共用八种方向,以F做示范参考:如何处理iOS中照片的方向http://www.cocoachina.com/ios/20150605/12021.htmlExif Orientation Taghttp://sylvana.net/jpegcrop/exif_orientation.htmlhttp://feihu.me/blog/2015...
2016-01-25 15:43:36
656
原创 iOS图片选择的优化与封装
前言照片的选取在App中是相当普遍的场景,如用户修改头像、上传照片。一般给用户两种选择 1拍照 2从相册选取在iOS中选择图片这个任务是通过UIImagePickerController来实现的,通过设置sourceType来决定是从相册选取还是拍照,当前的视图控制器需要实现UIImagePickerControllerDelegate协议的方法。 imagePickerContro
2015-11-01 14:37:12
596
原创 iOS客户端三方登录的封装
如今的应用的开始偏向社交化发展了,以产生粘性,也可以让用户登录进App体验更多的功能,而传统的注册登录的流程就稍显冗余,集成三方登录似乎势在必行。仅仅调用下客户端就完成注册登录,用户体验会有极大提升。常见的三方登录大致有微博、微信、QQ、豆瓣、人人。在开发蜜Live时,考虑我们的大部分用户是海外用户,特意集成了Facebook和Twitter登录。这里就主要讲述对微博、微信和QQ的登录封装。主要目
2015-10-25 19:01:39
1063
原创 记录
//用户有两种动作,1拖动到指定位置后执行scrollViewDidEndDragging,2滑动后,任其滚动后停止执行scrollViewDidEndDecelerating//1只对应 scrollViewDidEndDragging//2对应两种方法,(但scrollViewDidEndDragging的decelerate为YES)所以要判断,防止重复执行操作
2014-11-25 15:32:25
521
原创 快速排序
我们都知道冒泡排序是排序里面最简单的排序,很容易理解的一个排序算法。但它的时间复杂度为O(n^2)的,快速排序是对冒泡排序的一种改进,基本思想是,通过一轮排序将待排记录分割为独立的两部分,其中一部分的记录的关键字都比另一部分的关键字小,然后再分别对者两部分记录继续排序,已完成排序工作。假如待排序的数组为49 38 65 97 76 13 27 49.经过一轮快速排序后变成27
2014-10-08 14:27:02
614
原创 最基本的Web服务器(C#实现)
要实现Web服务器,就必须先了解HTTP协议。了解浏览器是如何通过HTTP协议与服务器进行通信的,把这些问题搞懂后,那Web服务器的框架就有了。我们所实现的是一个最基础的。不管用户发送何种请求,都返回一个页面,至少演示一下HTTP工作的流程。HTTP协议默认是80端口。所以一般浏览器发起请求时都没有显式的将端口放在地址里面。其实就可以看成是一次通信,有IP地址,有端口(80)。服务器和浏览器收
2014-10-05 11:24:53
4445
原创 OC的代理问题
OC可以告一段落了,OC总体来说确实不难,难点在于资料不多,且大部分是老外所写。而且OC语法与其他的常用语言如C、C++、Java、C#相差太大。老外的书写的固然好(国内一部分书基本都是照抄的,呵呵),但书的风格与我们习惯的不太一样,再经过翻译后,
2014-10-05 11:21:30
693
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人