zoukankan      html  css  js  c++  java
  • oc对象函数什么时候返回值类型使用instancetype

    oc中定义对象函数时经常会返回本类类型的对象,此时返回值类型用instancetype或者本类对象*都可以,什么区别呢?

    其实主要区别在返回值是不是self并且有继承

    如果返回值是self并且作为父类,那么返回值最好写成instancetype

    举例说明:

    父类的声明

    复制代码
    @interface Father : NSObject
    
    @property(readwrite,nonatomic,assign)NSInteger item;
    
    //元素自增 为了比较自增返回类型定为instancetype
    -(Father*)zizeng; 
    //元素自减
    -(instancetype)zijian;
    @end
    复制代码

    父类的实现

    复制代码
    @implementation Father
    #pragma mark - 自增
    -(Father*)zizeng{
        self.denominator += 1;
        return self;
    }
    
    #pragma mark - 自减
    -(instancetype)zijian{
        self.denominator -=1;
        return self;
    }
    
    @end
    复制代码

    子类的声明

    @interface Sub : Father
    
    @property NSInteger value;
    
    @end

    子类的实现

    @implementation Sub
    
    
    @end

    main函数的测试代码

    复制代码
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            Sub *s = [[Sub alloc]init];
            s.item = 2;
    
            NSLog(@"%ld",[s zijian].value);
            NSLog(@"%ld",[s zizeng].value);
    
    }
        return 0;
    }
    复制代码

    上述执行代码 [s zizeng].value 使程序崩掉了,原因是Father类中没有 value的选择器,而[s zijian].value 运行正常。

    可见以instancetype为返回值类型的函数在被继承后,会变为子类的类类型,也就是instancetype解释中的代表调用者的对象。

    这也就是为什么init函数返回值使用instancetype

  • 相关阅读:
    外包、构件和黑盒抽象等杂想
    C++类型转换小记(一)——C++转换操作符
    大学(一)
    【答】如何获取一个【备份路径】的信息?
    橘色超漂亮滑动二级导航菜单
    CSS自适应宽度按钮
    我们忽略的IE特效——一些特殊效果
    MSSQL 游标示例
    [存]超酷JS拖拽翻页效果
    漂亮的表格
  • 原文地址:https://www.cnblogs.com/ieso-ios/p/5064994.html
Copyright © 2011-2022 走看看