随记

实现缓存: 

NSCache相比NSDictonary:

1)多数情况下,可以使用objectForKey:  / setObject: forKey: /removeObjectForKey:

2)拥有多线程安全的特性,可以在任何线程上不加锁地修改NSCache;

3)还被设计为能与符合协议的对象整合,开发者可以通过调用 beginContentAccess 和 endContentAccess 控制何时丢弃对象是安全的

4)能在应用运行时/应用暂停时 提供自动缓存管理;也会在使用的常见类型NSurgreableData后, iOS会释放内存(即使应用处于暂停状态)。

----------------------------------------分割线------------------------------------------

图层绘制:(CALayer和UIView)

UIView是一个相当重量级的对象,它管理绘制与事件处理(尤其是触摸事件)。CALayer完全关乎绘制。事实上,UIView依靠CALayer来管理绘制,这样两者就能协作的很好。图层会在它的contents属性中绘制任意东西,开发者负责进行设置。

方法一:直接分配

UIImage *image = ...;

CALayer *layer = ...;

layer.contents = (id)image.CGImage;

方法二:core Animation会按照以下顺序通过CALayer和委托方法来创建它。

1)[CALayer setNeedsDisplay] : 代码需要调用它。它会将图层标记为需要重绘的,要求通过列表中的步骤来更新contents。除非调用了setNeedsDisplay方法,房子contents属性永远不会更新。

2)[CALayer displayIfNeeded] :绘制系统会在需要时自动调用它。如果图层通过被调用setNeedsDisplay标记为需要重绘的,绘制系统就会接着执行后续步骤。

3)[CALayer display]:  displayIfNeeded方法会在合适的时候调用它。开发者不应该直接调用它,如果实现了委托方法,默认实现会调用displayeLayer: 委托方法。否则,display方法会调用drawInContext:方法。可以在子类中覆盖display方法以直接设置contents属性

4)[delegate displayLayer: ] :默认的[CALayer display]会在方法实现这个方法时调用它。它的任务是设置contents。如果实现了这个方法(即使没有什么操作),后面就不会运行自定义的绘制代码。

5)[CALayer drawInContext:] :默认的display方法会创建一个视图图形上下文并将其传给drawInContext: 方法。它与UIView drawRect:方法相似,但不会自动设置UIKit上下文。为了使用UIKit来绘图,你需要调用UIGraphicsPushContext()方法指定接收到的上下文为当前上下文。否则,他只会使用Core Graphics在接收到的上下文中绘图。默认的display 方法获取最终的上下文,创建一个CGImage并将其分配给contents。默认的CALayer drawInContext:] 会在方法已实现时调用【delegate drawLayer: inContext】。否则,就不执行任何操作。不过可以直接调用这个方法

6)[delegate drawLayer: inContext:]: 如果实现了这个方法,默认的drawInContext:会调用这个方法实现更新上下文,从而是display方法可以创建CGImage。

总结:使用drawInContext:方法是设置contents的另一种方法。它是通过display方法调用的,而display 方法只有当你通过 setNeedsDisplay 方法明确标记图层为需要重绘是调用。

drawInContext:只在当前图层绘制(不包括期任何子图层)。要绘制图层及其子图层,可以使用renderInContext:方法,它可以捕捉图层当前动画的状态。renderInContext:使用当前渲染的状态(由Core Animation内部管理),因此它不会调用drawInContext:方法。

你可能感兴趣的:(随记)