iOS Dev (48) initializer 和 convenience constructor

iOS Dev (48) initializer 和 convenience constructor

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

你可能感兴趣的:(Constructor)