类方法经常出现在模型中,如下面:
#import <Foundation/Foundation.h>
@interface LQFlag: NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *dict;
+(instancetype)flagWithDict:(NSDictionary *)dict;
@end
这里有两个假设:
1)如果把类方法改成+(LQFlag *)flagWithDict:(NSDictionary *)dict;
假设这里有一个继承LQFlag的子类LQSubFlag,我们都知道子类继承父类所有的方法,当我们子类调用flagWithDict:的时候,LQSubFlag *sub = [LQSubFlag flagWithDict:nil]; 编译器是会报错,因为flagWithDict:返回的是LQFlag类。
2)如果把类方法改成 +(id)flagWithDict:(NSDictionary *)dict;
为什么不能用id?
不能使用点语法; [LQFlag flagWithDict:nil].name; 这是错的
id可以调用对象的方法,不利于编译器查错。[[LQFlag flagWithDict:nil] setFrame:CGRectZero]; setFrame:是控制器才能用的方法,到此时编译器并不能检查出错误。
总结:instancetype能自动识别是哪个类在调用,就会变成那个类的对象。