in iOS

得益于Objective-C的Runtime系统,对象的方法调用通过消息传递的机制进行,从而避免了很多情况下的判空操作。block也是Objective-C世界的对象,然而如果当它为空时,调用它却能导致崩溃。归根结底,其实是因为block的调用并不使用消息传递那套机制,而是通过跳转到特定的函数地址进行函数调用。我们可以先这么粗略的解释一下,然后再深入一点进行探讨。

Read More
in Architecture

在应用层面上,很多情况下计算机对于内存和存储器的操作都是高度抽象的,我们不必去关心其内部是如何工作的。但是总有那么些情况下,需要我们去了解其中的奥秘。在几年前开发aoFont的时候,就遇到了文件字节序(Endianness)问题,即大端序(Big endian)、小端序(Little endian)的问题。也就是需要读取的字体文件是以大端序存储的,但是iOS设备CPU使用的是小端序,这样以来直接读取出来的数据是错误的,需要对读取出来的数据进行处理。

Read More
in iOS

在开发过程中,常见到这样的写法:[NSDictionary dictionaryWithDictionary:otherDict][otherDict copy]。在很多情况下,我们甚至不用去考虑两种方法的异同,随机地选择用哪个方法。但二者又确确实实地有着些许不同。

Read More
in iOS

__attribute__指令在C、C++和Objective-C中修饰一段代码,用处一是为编译器提供上下文,用处之二是为未来看到这段代码的人(包括自己)提供额外的信息。__attribute__指令对编译器优化有重要意义,并且对于开发者来说一定程度的额外信息是有积极意义的。在开发过程中可以发现苹果的SDK中已经普遍运用了__attribute__指令。

Read More
in iOS

Key-value coding (KVC)是非直接地访问通过字符串访问Property的机制。这种机制下,我们通过键值对的形式来访问对象的属性,形式上类似于字典的操作。

Read More
in iOS

得益于Runtime系统,Objective-C将许多工作由编译时推迟到运行时进行。当然,这样的方式会牺牲掉部分性能,但却为这个语言带来了不少灵活性。其灵活性造就的黑魔法之一便是Method Swizzling。通过此方法,我们能够在程序运行时动态地将某个方法的实现与其他的实现交换。

Read More