UIView动画
使用[UIView animateWithDuration:…]执行动画改变view期间不宜重新加载view中的数据,尤其是有滑动操作的时候。(比如UITableView、UICollectionView等,最好在动画执行之前重载数据。)
1 | - (void)scrollViewDidScroll:(UIScrollView *)scrollView |
runtime理解
runtime是一套可以进行一些非常底层的用OC无法实现的操作的纯C语言的API
Objective-C类由一个指向objc_class结构体的指针来表示:
1 | //An opaque type that represents an Objective-C class. |
objc/runtime.h中objc_class结构体的定义如下:
1 | struct objc_class { |
一个类的实例由结构体objc_object来表示:
1 | //Represents an instance of a class. |
当我们向一个Objective-C对象发送消息时,运行时库会根据实例对象的isa指针找到这个实例对象所属的类。Runtime库会在类或其父类的方法列表中查询并执行与消息对应的selector指向的方法。
元类(MetaClass)是一个类对象的类
所有的类自身也是一个对象,我们可以向这个对象发送消息—调用类方法。
meta-class也是一个类,也可以向它发送一个消息。Objective-C的设计者让所有的meta-class的isa指向基类的meta-class,以此作为它们的所属类。即,任何NSObject继承体系下的meta-class都使用NSObject的meta-class作为自己的所属类,而基类的meta-class的isa指针是指向它自己。这样就形成了一个完美的闭环。
1 | UIView *testView = [[UIView alloc] init]; |
控制台输出:
1 | 0x7fa410c1f990 |
日历(NSCalendar)
1 | //日历 |
控制台输出:
1 | 2016-01-26 23:11:27.038 Test123[6502:707948] 2016-01-01 00:00:00 +0000 |