反编译分析并模拟实现methodSignatureForSelector方法

前言 最近跟同事讨论了有关methodSignatureForSelector:的问题,大概如下: 一个ProtocolA声明了一个实例方法funcA,然后一个类ClassA声明实现这个ProtocolA,但是并没有实现方法funcA,对ClassA的实例调用methodSignatureForSelector:@selector(funcA)能否返回正确的signature? 一个类ClassB,在@interface声明了实例方法funcB,但是没有实现funcB,对ClassB的实例调用methodSignatureForSelector:@selector(funcB),能否返回正确的signature? 写个Demo验证了下,结果非常有意思,不由得好奇起来,所以深入研究了下methodSignatureForSelector:的实现,然后自己模拟实现出来。 Github地址: »

用QuartzCode快速实现一个收藏动画

前言 “工欲善其事,必先利其器”,iOS的Core Animation非常强大,可以做出非常炫酷的动画,但是实际写起来还是比较麻烦,代码不直观,需要反复的改参数、Build、运行,所以诞生了各种动画制作工具,本文就以其中比较有名的QuartzCode为例,快速实现一个收藏功能的星星动画,最终的效果如下: GitHub地址:https://github.com/zekunyan/QuartzCodeExample-StarAimation QuartzCode简介 QuartzCode是一款专门用来创作iOS/macOS动画的软件,基本上把整个Core Animation框架的内容都搬到了软件里面, »

反编译分析Xcode8 Release环境下的一个二级指针的EXC_BAD_ACCESS问题

二级指针 二级指针,也叫指针的指针,或者Out Parameters,可以用来改变一个指针的地址值,由于在Objective-C里面方法、函数不支持返回多个值,所以经常用二级指针实现这个功能,比如NSFileManager的- (BOOL)removeItemAtURL:(NSURL *)URL error:(NSError **)error方法,就可以让方法在内部创建error后传出。 问题 最近在Debug代码的时候,注释掉了一个带有二级指针参数的方法内部所有代码,然后在Release环境下安装运行,结果居然Crash了,猛然想起好像以前同事也遇到过,仔细检查了下,感觉代码是没有问题的, »

ViewController中的UIView Property要设置为weak还是strong

众所周知,从IB中拖出来的outlet Xcode会默认设置为weak,那么代码new出来并且addSubview到self.view的view,我们在property里要设置为strong还是weak呢。 Weak or Strong? 假设一个ViewController的self.view中有一个Label,那么他们三者的关系是: self.view--strong-->Label" /> 可以看到Label的所有者其实是self.view,正常来说一个对象只有一个所有者,如果再将ViewController中的Label引用声明为strong,那么当label从self.view中移除后,label将不会销毁,造成View的冗余。 于是我们愉快地把Label声明为weak,但是在初始化label的时候,Xcode又猝不及防地扔给我们一个warning。 »

KVOController开源库bug分析

FBKVOController是一个对KVO机制简单封装的开源库,最大特点就是持有了observer与observe object及其keyPath的关系,利用delloc自动移除observer,同时提供了便捷的block方式去处理观察对象keyPath值的变化,省去了NSKeyValueObserving协议中原生API的麻烦。 看起来很棒!但,它并非完美。 问题 举个例子,当需要观察自身keyPath值变化时 使用KVO原生API在init中添加Observer,并在dealloc中移除Observer,代码如下: - (instancetype)init { self = [super init]; if (self) { [self addObserver:self »