YYModel源码分析

根据JSON生成Model是一个iOS开发经常用到的内容,这方面开源的也很多,比如我们公司用的Mantel,但其实效率很一般,最近看了YYModel,区区五个文件,功能简单且高效,于是就认真学习一下人家是怎么实现的。

在我想来,主要就是通过runtime方法获取property和ivar就可以了,通过判断每个ivar的类型,然后根据不同的类型给每个property赋值,应该算是不太难的。在网上看到了这篇文章,就是我想的这个样子,但是YYModel的作者可不是这么认为的。

作者首先通过runtime方法,生成YYClassInfo,其中YYClassInfo主要是取了YYClassIvarInfo,YYClassMethodInfo,YYClassPropertyInfo。然后通过YYClassInfo构造YYModelMeta。

YYModelMeta里面包括YYModelPropertyMeta
这个过程中,我还有些疑问的,为啥一定要构造这么多中间类呢?咱们继续往下看。

实际的操作过程中,YYClassIvarInfo和YYClassMethodInfo都没有用到,主要就是用到了YYClassPropertyInfo,由此构造YYModelPropertyMeta,再生成YYModelMeta。

作者都采用了CoreFoundition类型,比如CFStringRef,CFArrayRef等的操作,相对于 Foundation 的方法来说,CoreFoundation 的方法有更高的性能,用 CFArrayApplyFunction() 和 CFDictionaryApplyFunction() 方法来遍历容器类能带来不少性能提升,以及赋值也是采用objc_sendMsg的方法,就是为了快,省去很多OC方法的查找,这就不难理解,作者为什么用那么多的中间类来记录Method,Ivar,property的setter和getter了。

作者在文章中对各个开源库进行了对比,图文声茂,功底了得,膜拜一把。

shadowsocks无法更新pac

这两天上网发现facebook竟然不能登录,于是首先怀疑了是不是ss账号的问题,换了几个服务器,自己的电脑还是不行,但是其他人的都可以,于是就想是不是gfwlist需要更新先,然后就操作·Update pac from GFWList·,但是发现竟然还是request error 404. 之前自己也遇到过这样的事情,但是读没有怎么在意,今天因为要登陆facebook,所以才决定解决下的。

FBRetainCycleDetector代码学习

FBMemoryProfiler是Facebook开源的一款用于分析iOS内存使用和检测循环引用的工具库,可以让你在应用程序内运行循环应用检测。底层主要由FBAllocationTrackerFBRetainCycleDetector两块来实现功能。

FBAllocationTracker

通过在main.m中添加

[[FBAllocationTrackerManager sharedManager] startTrackingAllocations];
-->FB::AllocationTracker::beginTracking
-->    replaceSelectorWithSelector([NSObject class],
                            @selector(alloc),
                            @selector(fb_newAlloc),
                            FBClassMethod);

      replaceSelectorWithSelector([NSObject class],
                            sel_registerName("dealloc"),
                            @selector(fb_newDealloc),
                            FBInstanceMethod);

就开启了内存检测,主要是通过替换对象的+alloc -delloc 方法,替换后

alloc-->fb_newAlloc是IMP-->
fb_originalAlloc-->alloc的IMP
所以[nsobject alloc]-->fb_newAlloc的IMP-->.....

前端代码学习之布局

1 选择器

div p div下所有p元素,可能多个层级
div>p div下的子元素p,只能是一级
div+p div兄弟节点的第一个p
div~p div兄弟节点所有p元素

class^=是什么意思啊

这是css属性选择器的一种:[attribute^=value] ,用来匹配属性值以指定值开头的每个元素。例如:
[class^=”test”] { background:#ffff00; }

表示设置 class 属性值以 “test” 开头的所有元素的背景色,也就是说对class=”test”, class=”test1” class=”test-001”的元素都是有效的。
除此之外,还有一些常用的css属性选择器如下:

  • [attribute~=value] 选取属性值中包含指定词汇的元素
  • [attribute|=value] 选取带有以指定值开头的属性值的元素,该值必须是整个单词。
  • [attribute$=value] 匹配属性值以指定值结尾的每个元素
  • [attribute*=value] 匹配属性值中包含指定值的每个元素

css中的伪元素after和before的默认顺序

今天在学习CSS动画的时候,看到很多动画都是采用了伪元素 :before和:after,他们是干什么的以及怎么用,可以自行google,我这里主要是对他们的顺序进行一下探讨。
乍感觉一下,after应该是在原元素的前面,而before应该是在后面,实际上不是这样的,after和before都算是他的子元素,所以默认情况下,他们都是在原始元素的前面,借用网友的一张图片,他是在这样显示的,如果还有不相信的。

在chrome中调试custom JS代码

如何在chrome中调试JS代码呢,如果本身网页中就有js代码文件,那么打开chrome,mac上快捷键option+command+i,然后进入开发者模式,选择Sources,content Scripts,进行正常的调试即可,这里不做过多的介绍,需要的可以到参考官方文档

自己在这里主要介绍的是如何调试自己写的JS脚本,本身还没有嵌入到网页中的,这里就需要用到另外一个Snippets,这个就是自己在这里写JS脚本,然后run之后,就可以在console中进行调试,跟加载在网页中的一样。

  1. 右键Snippets区域 选择new,然后创建一个js文件,这里取名hui.js
  2. 编辑hui.js,并保存。
  3. 右键hui.js文件,然后选择run
  4. 设置断点
  5. console中执行js中的功能,记性断点调试即可。

如下截图

###参考链接

####https://developers.google.com/web/tools/chrome-devtools/debug/snippets/