Cocoa China 文章精选

Cocoa China 是国内首个苹果产品的中文社区网站,致力于打造最大的苹果中文开发社区,资讯详实多样,值得关注。

探讨的几个点Texture的简介 (What)为什么要使用Texture (Why)Texture的作者 (Who)Node的异步绘制如何实现 (How)Node的异步渲染(Runloop任务分发)如何实现 (How)Texture的布局引擎 (How)Texture的使用能带来什么收益 (How Much)texture简介:Texture(原名AsyncDisplayKit)是FaceBook开源的一款能够保持界面流畅的框架...(smooth and responsive)Texture整体架构Node:对UIView和CALayer的抽象Node Containers:node容器,负责加载渲染nodeLayout Engineer:node布局Texture节点容器与UIKitTexture节点子类与UIKitTexture节点子类继承树为什么要使用Texture布局计算、解码、绘制,异步并发执行Runloop任务分发(异步渲染)声明式布局系统图层预合成深度优化列表性能(智能预加载)Texture:图层预合成有时一个 layer 会包含很多 sub-layer,而这些 sub-layer 并不需要响应触摸事件,也不需要进行动画和位置调整...Texture布局引擎相对于AutoLayoutUIKit AutoLayout 在复杂的视图结构中,计算量会呈指数级增长,Texture的布局方案相对AutoLayout有以下优点:快:Texture的布局计算和手写frame一样快异步和并发:布局可以在后台线程上计算声明式渲染:布局使用不可变的数据结构声明,实现一个layout视角从专注view之间的距离和约束,转变成划分和制定不同view子域的布局规则,抽象层级变高,使得布局代码更容易开发、维护可缓存:如果布局是不变的,自动在后台预先计算并缓存可拓展:在不同的类中使用相同的布局会变得很方便Texture的布局系统Texture自己定义了一套强大的automatic layout布局系统,这套布局系统基于CSS的Box Model,通过提出LayoutSpec概念,使得我们可以通过声明式的方法来定义布局...

?;pp,一般常见的问题不会导致闪退,增强App的健壮性,同时会将错误抛出来,根据每个App自身的日志渠道记录,下次迭代修复那些问题.Unrecognized Selector Sent to InstanceNSArray,NSMutableArray,NSDictonary,NSMutableDictionaryKVOZombie PointerNSTimerNSNotificationUnrecognized Selector Sent to Instance由于Objective-c是Message机制,而且对象在转换的时候,会有拿到的对象和预期不一致,所以会有方法找不到的情况,在找不到方法时,查找方法将会进入方法Forward流程,系统给了三次补救的机会,所以我们要解决这个问题,在这三次均可以解决这个问题resolveInstanceMethod:(SEL)sel这是实例化方法没有找到方法,最先执行的函数,首先会流转到这里来,返回值是BOOL,没有找到就是NO,找到就返回YES,如果要解决就需要再当前的实例中加入不存在的Selector,并绑定IMP,示例如下:static?void?xxxInstanceName(id?self,?SEL?cmd,?id?value)?{????NSLog(@"resolveInstanceMethod?%@",?value)...还可以流转到多个对象,[anInvocation invokeWithTarget:xxxtarget2]是为了让不存在的方法有着陆点doesNotRecognizeSelector:(SEL)aSelector执行到这里的时候,两种情况:当methodSignatureForSelector返回一种任意的方法签名的时候,也会进入doesNotRecognizeSelector,但是不会闪退当methodSignatureForSelector返回nil时,进入doesNotRecognizeSelector就会闪退根据以上流程,最终还是选择流程2,原因如下:resolveInstanceMethod虽然可以解决问题,给不存在的方法增加到示例中去,会污染当前示例forwardInvocation在三步中式最后一步,会导致流转的周期变长,而且会产生NSInvocation,性能不是最好的选择NSArray,NSMutableArray,NSDictonary,NSMutableDictionary类族(Class Cluster)NSDictonary,NSArray,NSString等,都使用了类族,这种模式最大的好处就是,可以隐藏抽象基类背后的复杂细节,使用者只需调用基类简单的方法就可以返回不同的子类实例Swizzle Hook这里就不赘述Swizzle概念了,Google到处都是讲解的,这里给一个典型的例子:swizzleInstanceMethod(NSClassFromString(@"__NSArrayI"),?@selector(objectAtIndex:),?@selector(hookObjectAtIndex:))...}Zombie Pointer让野指针不闪退是模仿了XCode debug的Zombie Object,也参考了网易和美团的做法,主要是以下步骤:Hook住dealloc方法如果当前示例在黑名单里,就把当年前示例加入集合,并把当前对象objc_destructInstance清理引用关系,并未真正释放内存,并将object_setClass设置成自己的中间对象Hook中间对象的方法,收到的消息都由中间对象来处理维护的野指针集合,要么根据个数来维护,要么根据总大小来维护,当满了,就需要真正释放对象内存free(obj)存在的问题:需要单独的内存那些问题对象最后释放内存后,再访问时会闪退,这个方法只是一定程度延迟了闪退时间需要后台维护黑名单机制,来指定那些问题对象KVO,NSTimer,NSNotification这三种放在一起,是因为他们之间有共同的特征,就是创建后,忘记销毁会导致闪退,或者会有一些异常的情况,所以需要一种知道当前创建者啥时候释放,首先会想到dealloc,这样会Hook的NSObject,在一定程度会影响性能,后面发现一种比较优雅的方法,原理来自于Runtime源码:/************************************************************************?objc_destructInstance*?Destroys?an?instance?without?freeing?memory.?*?Calls?C++?destructors.*?Calls?ARR?ivar?cleanup.*?Removes?associative?references.*?Returns?`obj`.?Does?nothing?if?`obj`?is?nil.*?Be?warned?that?GC?DOES?NOT?CALL?THIS.?If?you?edit?this,?also?edit?finalize.*?CoreFoundation?and?other?clients?do?call?this?under?GC.**********************************************************************/void?*objc_destructInstance(id?obj)?{????if?(obj)?{????????//?Read?all?of?the?flags?at?once?for?performance.????????bool?cxx?=?obj->...

当CPU要读取一个页时,检查标记发现当前的页是未缓存的,会触发一个(Page Falut)缺页中断,这时内核、、操作系统的缺页异常处理程序,去选择一个牺牲页(有时候内存够用不用置换别的界面),然后检查这个页面是否有修改,有修改先写会磁盘,然后将需要使用到的内存加载到物理内存中,然后更新PTE 随后操作系统重新把虚拟地址发送到地址翻译硬件去重新处理...减少内存众所周知CPU要比Memory快10^3个数量级,即便CPU中的L3Cache 也比Memory快很多,如果MMU美的地址翻译都要去查找多级PT,这个开销就会非常巨大,但是所幸 程序的局部性原理能够解救我们,MMU芯片内置一个 翻译后备缓冲器(Transalation Lookaside Buffer TLB )的硬件来充当缓存,加快地址翻译的效率.现代 OS 虚拟内存系统操作系统为每个进程维护一个单独的虚拟地址空间,分为两部分...}MMAP在iOS中的用处mmap让读写一个文件像操作一个内存地址一样简单方便,mmap效率极高,不用将一个内容从磁盘读入内核态再拷贝至用户态mmap映射的文件由操作系统接管,如果进程Crash 操作系统会保证文件刷新回磁盘动态内存分配虽然可以使用上面的低级API去映射内存,但是需要动态申请内存用来做变量处理的时候就需要动态内存分配器(Dunamic memory allocator)简单理解为 malloc calloc realloc free等函数来自的库就称为DMA.动态内存分配器将一个内存的区域(Heao)分为不同的大小的块(block),这些块要不然就是分配的,要不然就是空闲的...