• 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

  • 相关阅读:
    ie浏览器设定主页修改
    诺基亚5800通讯录倒入到dopod的联系人中去的解决办法
    局域网中根据IP地址反查主机的名称(C#)
    U盘维修
    查找xml文件中某接点的值
    如何更改任务栏颜色
    如何给一个div赋值(改变div原来的值)
    explicit的作用
    重建二叉树
    常函数
  • 原文地址:https://www.cnblogs.com/ieso-ios/p/5064994.html
Copyright © 2020-2023  润新知