前阵子同事把他的mac book pro借给了我,于是乎,除了没事摸几下这机器光滑的外壳外,顺便也学习了下Objective-C。由于一直以来主要的开发语言都是C++,而最近这mac电脑得归还了,这里就随便记录几条Objective-C的特点,免得白学。
Objective-C中比较重要的概念:消息、ref count、protocol、category、selector
- 消息:Objective-C中的消息类似于C++中调用类的方法,不同的是,Objective-C中可以对消息进行动态处理。比如消息处理 [instanceClassA methodFoo],若类A并没有实现Foo这个方法,那么可以通过resolveInstanceMethod来重定位类实例方法,若仍然无法处理消息,则还可以进一步通过methodSignatureForSelector和forwardInvocation来修改方法签名,转发给其他类实例处理。
- ref count: Objective-C中继承NSObject的类即获得了免费的ref count机制,使用retain和release来控制引用次数,次数为0自动释放。Objective-C中还存在一个autoreleasePool,用于将autorelease的对象随时释放掉。C++一直以来许多bug都在内存的管理上,要么new出来的没有delete,要么delete掉了还在使用。Objective-C使用这种ref count来保证内存管理灵活性的同时减少了程序的出错机会。
- protocol:这个其实比较好理解,在C++中就是有一堆纯虚函数的类(接口类),Objective-C中用协议这个词来表达接口感觉更贴切。不管是A还是B,只要遵循某个protocol,它们对外界所表现出来的功能就一致。Objective-C中就是利用protocol实现的delegate机制。
- category:在C++中若要扩展一个类,那么就是继承它,然后加入新的方法。 Objective-C呢,比如要给类A扩展方法bar,直接写这个类的category,加入新的方法,然后包含这个头文件,调用 [a bar]。
- selector:selector是Objective-C中类中方法的标识。Objective-C中每个类都有一个self,类似于C++中的隐含的this,用来指代自己。类中每个方法都会被编译器生成一个标识,用selector可以通过方法名来获取这个标识号。当Objective-C调用某个实例方法Foo时,其实是调用一个全局函数。这个函数Foo是如何找到的呢?其实就是用Foo这个方法名通过selector找到标识,然后调用Foo(self, params)。对于有继承关系的多态调用,比如类B继承类A,A继承NSObject,首先查找B有没有Foo,没有的话isa指针(Objective-C中实现多态的机制)转到类A,寻找A中是否有Foo,最终NSObject都没有找到的话走上述所说的消息动态处理的流程。
Objective-C总体来说比C++要简单地多,不过如果不在Mac上开发应用程序的话,Objective-C就没有什么用武之地了。。。毕竟编程语言价值在于实用。所以学习Objective-C还需要学习os x上的cocoa框架、Application Kit,iOS上的UIKit。各种API。。。