- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
阅读Facebook POP框架
阅读Facebook POP框架
在这一系列文章里,我主要会将自己阅读第三方代码的经历记录下来,尝试独立分析解剖一个框架。之前也阅读过一些第三方代码,但是实际上来说对自己的成长并没有太大的帮助,因为阅读的不细致,没有领会到代码的精髓。我希望能够通过记录笔记并发布到博客上这样的方式来一步步的学习优秀框架。第一个框架是POP,其次是AFN和SDWebImage。之所以先读POP,主要是因为我对POP 了解的很少,好奇心驱使我先阅读POP??。
一、入门
其实阅读代码我觉得最困难的就是第一步,找不到头绪不知道从哪里看起。我是先到GitHub上查找了官方的使用介绍,先找到如何使用这个框架,这个框架最常用的有哪些方法和类。可以看出除了如何安装和导入框架外,官方主要介绍了4个类及其使用方法分别是:POPSpringAnimation、POPDecayAnimation、POPBasicAnimation、POPCustomAnimation,同时也介绍了POPAnimatableProperty、POPAnimationTracer 这两个类。根据名字判断前4个类是4种常见的动画,POPAnimatableProperty应该是可扩展的动画属性,POPAnimationTracer应该是动画过程跟踪类。
二、从POPSpringAnimation开始
首先我们先看一下POPSpringAnimation,毕竟POP 最重要是还是前4种动画类,我们先拿出一个类来看看。首先可以看出它是继承POPPropertyAnimation的。
1 @interface POPSpringAnimation : POPPropertyAnimation
跳转到POPPropertyAnimation 我们会发现它是继承自POPAnimation的,而POPAnimation则是继承自NSObject。也就是说POPAnimation是各种动画的基类。POPAnimation应该包含了动画的共同的基本属性和方法。
1
2
3 @interface POPPropertyAnimation : POPAnimation
@interface POPAnimation : NSObject
观察头文件,里面包含了Animation的 代理、标识、回调等等,这些都是比较好理解的。比较好的是这个POPAnimation 是个抽象基类,也就是说说你不能直接用这个类new 一个对象,但是它提供了一个_init 方法。
- (id)init
{
[NSException raise:NSStringFromClass([self class]) format:@Attempting to instantiate an abstract class. Use a concrete subclass instead.];
return nil;
}
- (id)_init
{
self = [super init];
if (nil != self) {
[self _initState];
}
return self;
}
- (void)_initState
{
_state = new POPAnimationState(self);
}
- (void)dealloc
{
if (_state) {
delete _state;
_state = NULL;
};
}
其中_state 结构体在匿名分类中定义,它主要记录当前动画的信息,基本上动画的相关信息都能在结构体中找到。 POPAnimation主要实现的就是针对动画状态_state的存取,这样的好处是子类可以随时获取动画的状态。当代码读到这里,其实我还有两个疑问:
1、这个属性是干嘛用的?
1 @property (readonly, nonatomic) POPAnimationTracer *tracer;
2、代理为什么没有指定要遵循的协议?(这个问题很奇怪,因为我看绝大多数代码都是需要遵循某个协议的)
/**
@abstract The animation delegate.
@discussion See {@ref POPAnimationDelegate} for details.
*/
@property (weak, nonatomic) id delegate;
这两个问题在当前类中找不到答案,先去查找 POPAnimationTracer类,解决问题1。
看注释这个类是辅助单元测试和debug的。它的作用是将操作数据当做一个事件放入事件队列中,在事件队列中就记录了一个动画的详
原创力文档


文档评论(0)