iOS Dev (48) initializer 和 convenience constructor
- 作者:大锐哥
- 博客:http://prevention.iteye.com
initializer
这个你应该很熟悉。
- (id)initWithSomething;
convenience constructor
但是在实际运用中,我们经常用的写法是:
[[Foo alloc] init];
如果把这货定义成一个方法,如下:
+ (id)buildInstance;
除了写着简单,还有啥区别?
initializer 会被编译器自动地写成:
- (instancetype)initWithSomething;
convenience constructor 则不会被编译器优化。所以可能会遇到问题,比如下面:
Foo.h
#import <Foundation/Foundation.h>
@interface Foo : NSObject
+ (id)buildInstance;
- (id)init;
@end
Foo.m
#import "Foo.h"
@implementation Foo
+ (id)buildInstance
{
return [[self alloc] init];
}
- (id)init
{
return [super init];
}
@end
这时候你调用:
[[Foo buildInstance] doSomethingElse];
[[[Foo alloc] init] doSomethingElse];
第一句不会报错,第二句会报错。而如果你改一下:
+ (instancetype)buildInstance
这两句都会报错。为什么?
因为第一句在 buildInstance 返回值为 id 的情况下,编译器是不会知道该把返回值当成谁,也无法找到 doSomethingElse 这个方法。
init 被编译器当作返回 instancetype,convenience constructor 不会
当然还有很多其他的好处,以后慢慢体会吧。
转载请注明来自大锐哥的博客:http://prevention.iteye.com