gpt4 book ai didi

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

转载 作者:技术小花猫 更新时间:2023-10-29 11:15:00 24 4
gpt4 key购买 nike

我正在学习这个初学者教程 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

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

我正在查看这个初始化器:

 - (id)initWithTitle:(NSString *)title rating:(float)rating {
}

除了那样写,我也可以这样写:

  - (RWTScaryBugData *)initWithTitle:(NSString *)title rating:(float)rating {
}

谁能告诉我区别?或者,如果这真的不重要?

最佳答案

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

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

问题是你还可以说:

NSString *string = [NSArray array]; // bad

那会进行类型检查。 Apple 引入了 instancetype 作为新的返回类型,它返回使用 instancetype 声明的类。今天,array 方法返回 instancetype 以便对上面的前 2 个示例进行类型检查,但坏示例不会进行类型检查。

更多详细信息,请参阅 NSHipster article on the subject .

关于ios - Objective-C 返回类型 : "-(id) init" vs "-(ClassName *) init",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25455265/

24 4 0