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

转载于:https://www.cnblogs.com/ieso-ios/p/5064994.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值