Objective-C返回类型:" - (id)init"vs" - (ClassName*)init"

Hei*_*erg 9 objective-c ios

我正在关注这个初学者教程http://www.raywenderlich.com/1797/ios-tutorial-how-to-create-a-simple-iphone-app-part-1,我有一个关于这个课程的问题及其在这里实施:

 RWTScaryBugData.h

 @interface RWTScaryBugData : NSObject

 @property (strong) NSString *title;
 @property (assign) float rating;

 - (id)initWithTitle:(NSString *)title rating:(float)rating;
 @end
Run Code Online (Sandbox Code Playgroud)
RWTScaryBugData.m

@implementation RWTScaryBugData

@synthesize title = _title;
@synthesize rating = _rating;

- (id)initWithTitle:(NSString *)title rating:(float)rating {
    if ((self = [super init])) {
        self.title = title;
        self.rating = rating;
    }
    return self;
}

@end
Run Code Online (Sandbox Code Playgroud)

我正在看这个初始化器:

 - (id)initWithTitle:(NSString *)title rating:(float)rating {
 }
Run Code Online (Sandbox Code Playgroud)

我可以这样编写它,而不是像那样写它:

  - (RWTScaryBugData *)initWithTitle:(NSString *)title rating:(float)rating {
    }
Run Code Online (Sandbox Code Playgroud)

有人能告诉我区别吗?或者,如果它真的不重要?

Max*_*iel 12

返回id而不是类是Objective-C中的一个约定,用于允许子类覆盖该初始化程序并返回它们的类型.例如,对于一个长时间的array类方法的NSArray返回id,这样NSMutableArray可以覆盖这个方法,并返回一个可变的数组,所以这两个是可能的:

NSArray *array = [NSArray array];
NSMutableArray *mutableArray = [NSMutableArray array]; // Wouldn't be possible if the method returned (NSArray *)
Run Code Online (Sandbox Code Playgroud)

这个问题是你也可以说:

NSString *string = [NSArray array]; // bad
Run Code Online (Sandbox Code Playgroud)

这将是一次挑战.Apple引入instancetype了一种新的返回类型,它返回instancetype使用声明的类.今天,该array方法返回instancetype以便前面的2个例子进行类型检查,但不好的例子不会进行类型检查.

更多细节,请参阅有关该主题NSHipster文章.


que*_*ish 5

在这些情况下,推荐的返回类型是instancetype.这在文档中有所涉及.