类方法前面为什么要用instancetype而不用id?
2017-06-16 11:06
344 查看
类方法经常出现在模型中,如下面:
#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能自动识别是哪个类在调用,就会变成那个类的对象。
#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能自动识别是哪个类在调用,就会变成那个类的对象。
相关文章推荐
- 开源中国 客户端 AppManager 类从栈中删除元素的方法为什么不用出栈的方法呢?
- ID的生成策略(hibernate的id生成策略,主键类为什么需要实现序列化接口,同时还要重写hashCode()和equals()方法)
- 为什么Response、Request不用前面不用加Context?
- ID的生成策略(hibernate的id生成策略,主键类为什么需要实现序列化接口,同时还要重写hashCode()和equals()方法)
- java中getter 和 setter 方法有什么意义?为什么不用public代替GS?
- 我们为什么应该用instancetype 代替id?
- 创建线程的几种方式,以及为什么启动线程不用run,而用start方法。
- 为什么你需要使用instancetype而不是id
- 为什么使用Junit Test而不用普通java main方法来完成测试?
- OC 类方法,对象方法,构造方法以及instancetype和id的异同
- 多线程用同一个dao对象就会存在多个线程执行同一方法,为什么不用考虑线程安全问题
- 为什么要加号"+"方法?为什么方法前面要写“+”号?很多人由于书本的术语太专业了,暂时看不懂,理解不到--iOS开发
- 为什么有的服务器控件在看源文件时控件的ID前面多了字符串,有的却没有呢
- iOS-不用ID的打包方法
- C#,输出时,为什么前面有的要写{0}{1},但是有的就不用写呢?
- oc中,方法的返回类型用instancetype代替id有什么好处
- init构造方法以及id和instancetype的区别
- bootstrap 不用ID绑定的下拉框的方法
- 扩展方法为什么用分类不用子类
- 实现Comparator接口为什么不用实现Equals方法