在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
我们知道,大部分面向对象语言对于一个类的成员方法都有一个隐含的参数。在C++、Java、C#和JavaScript中是this,而在Objective-C中则是self。当然,由于Objective-C++要完全兼容标准C++,因此关键字不能与C++有所冲突,所以用了self。
@interface MyClass : NSObject + (id)createMyObject; @end @implementation MyClass - (id)init { self = [super init]; NSLog(@"Hello, world"); return self; } + (id)createMyObject { MyClass *mc = [[self alloc] init]; return [mc autorelease]; } @end 我们看到,上述代码片段中MyClass类的createMyObject类方法中通过self来调用NSObject的类方法alloc。这里,self指向了createMyObject这个消息所发送给的类。当我们用[MyClass createMyObject]这句语句时,createMyObject中的self其实就指示了MyClass类本身。因此,可以直接用self来调用类方法alloc。
@interface MyClass : NSObject + (instancetype)createMyObject; - (void)dummyMethod; @end @implementation MyClass - (id)init { self = [super init]; NSLog(@"Hello, world"); return self; } + (instancetype)createMyObject { MyClass *mc = [[self alloc] init]; return [mc autorelease]; } - (void)dummyMethod { } @end 这样一来,我们如果这么用:[[MyClass createMyObject] dummyMethod]会非常安全。因为createMyObject方法所返回的对象可确保是与MyClass类相兼容的。 这里需要注意的是instancetype只能用作为返回类型,不允许作为参数或用于定义临时变量。 我们下面将提供一个结合self特性与instancetype特性的工厂方法: @interface MyClass : NSObject + (instancetype)createMyObject; - (void)dummyMethod; @end @interface MySubClass : MyClass @end @implementation MyClass - (id)init { self = [super init]; NSLog(@"Hello, world"); return self; } + (instancetype)createMyObject { MyClass *mc = [[self alloc] init]; return [mc autorelease]; } - (void)dummyMethod { } @end @implementation MySubClass - (id)init { self = [super init]; NSLog(@"Hi, world!"); return self; } - (void)dummyMethod { NSLog(@"I am a child."); } @end 你可以调用[[MySubClass createMyObject] dummyMethod],可以看看输出结果。
当然,C++、Java等编程语言都是这么做的。而Objective-C目前有两种状态,一种是MRC(Manual Reference Count),另一种是ARC(Auto Reference Count)。这两种模式对于实例创建而言是不一样的。前者创建完了之后,需要调用release,而后者则不需要。因此,我们通过上述讲解的通过类方法来创建autorelease对象来有效地屏蔽应用层接口的统一性问题。我们看到Apple自己在iOS7.0开始可用的框架都大量用了此种方法。这样,通过模版自动生成出来的代码不管是在MRC下还是在ARC下都能正常工作。
|
请发表评论