简介:
Objective-C有两种Runtime:Modern Runtime和Legacy Runtime。
Modern Runtime运行在大多数现在平台和体系结构中,他是Apple几年前开始64bits开发的时候重新编写的。Legacy Runtime是NextStep1990时代的产物。Legacy Runtime因为2进制兼容问题而无法支持一些特性,而Mordern Runtime的设计目标就是支持这些特性。
Legacy Runtime在32-bit MacOS以及32-bit上的iPhone模拟器上运行着。Modern Runtime运行在64-bit MacOS,iPhone Device以及64-bits下的iPhone Simulator上。对于雪豹上面的iOS开发者,他们不用再担心模拟器和真机跑在不同的Runtime下,真对于iOS开发者来说的一个重大意义是:你现在可以生成一个应用程序,然后同时运行在不同iPhone Simulator下面(细心的用户可能会注意到,iOS SDK4开始,编译一个版本后,要切换不同device的模拟器并不需要重新编译代码了)
Objective-C语言和Runtime高级技术:(编译器方面Xcode4支持,iOS3.1以后支持,MacOS不支持,iPhone和MacOS的SDK都还不支持,姑且认为这些都是明年会用到的东西)
老的Runtime的一些技术:
(1)class extensions
(2)@synthesized properties
(3)weak-linked class
class extensions:是你的class的第二个或者第三个,甚至第四个(以此类推)interface,他看上去就像一个匿名的category。在class extensions里面,你可以定义额外的方法,他们不会在public 接口里面出现。
example:
PetShowView.h中定义一个petShopView
@interface PetShopView : NSView {
}
@property (readOnly ) int poppyFood;
@end
在PetShowView-Private.h中定义这个类的扩展
@interface PetShowView()
@property (readWrite ) int poppyFood;
-(void) feedSnakeWith:(id)Food;
@end
新特性允许你在 class extension里面也定义属性!并且只在LLVM 编译器中提供这个功能,GCC不支持。并且需要一些编译属性支持: C Flags = -XClang - fobjc -nonfragile-abi2
@interface PetShowView()
{
@private
NSArray * kittens;
}
@property (readWrite) int poppyFood;
-(void) feedSnakeWith:(id)Food;
@end
@synthesized,帮你自动完成setter,getter。新特性是,Xcode4设置让你synthesize都不用写。 不过当你不需要编译器完成这些工作,只工作在Modern Runtime下,需要LLVM编译器。当你不需要编译器做这些的时候,可以用@dynamic方法来做,具体自己也没试演过,先记一笔
Weak Link,让你使用新特性(新的类)的同时,兼容老的iOS。一般的做法是:
Class testClass = NSClassFromString(@"className");
if (testClass){Do something}
else {do Other things}
而且,如果继承了一些目标iOS平台上没有的类,那么运行时会crash。
新特性解除了后面那个限制,并且使用起来更简单。不过不幸的是。。还没完全实现。。要等明年,需要Xcode4里面的GCC或者LLVM,Runtime需要iPhoneOS3.1,SDK还没有实现
if([SomeClass class])
{
[SomeClass doSomeThing];
}
else
{
do OtherThing
}