美文网首页
instancetype和id的区别

instancetype和id的区别

作者: 齐滇大圣 | 来源:发表于2015-12-26 22:54 被阅读159次

    instancetype 是只能作为返回值而不能作为参数的。
    当一个类返回相同类的实例的时候使用 instancetype 是合适的。

    对于编译器来说以下两个是一样的,因为编译器会将①自动转换为②
    ①-(id)init;
    ②-(instancetype)init;

    但如果不是init的话结果就不一样了
    ① +(id)buildInstance;
    ②+(instancetype) buildInstance;
    下面放一个例子

    @interface Foo : NSObject
    +(id)buildInstance;(非关联返回类型方法)-(id)init;(关联返回类型方法)@end
    @implementation Foo+(id)buildInstance{return [[self alloc] init];}-(id)init{return [super init];}@end
    @interface Bar : Foo- (void)doSometingElse;@end
    @implementation Bar- (void)doSometingElse {}@end

    [[[Foo alloc] init] doSometingElse];//返回的是foo类的实例,因为编译器会自动把id转换为instancetype,所以会有警告说无dosometingelse方法
    [[[Bar alloc] init] doSometingElse];//返回的是bar类的实例
    [[Foo buildInstance] doSometingElse];//返回的可以是bar类的实例,因为不是init编译器不会把id转换为instancetype,所以不会有警告[[Bar buildInstance] doSometingElse];//返回的是bar类的实例

    但如果把-(id)buildInstance;改为-(instancetype)buildInstance;
    则[[Foo buildInstance] doSometingElse];会有警告,因为返回的是foo类的实例,无dosometingelse方法

    相关文章

      网友评论

          本文标题:instancetype和id的区别

          本文链接:https://www.haomeiwen.com/subject/rjdbhttx.html