码迷,mamicode.com
首页 > 其他好文 > 详细

oc对象函数什么时候返回值类型使用instancetype

时间:2015-12-21 23:19:44      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:

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

 

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

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

举例说明:

父类的声明

技术分享
@interface Father : NSObject

@property(readwrite,nonatomic,assign)NSInteger item;

//元素自增 为了比较自增返回类型定为instancetype
-(instancetype)zizeng;
//元素自减
-(Father*)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

oc对象函数什么时候返回值类型使用instancetype

标签:

原文地址:http://www.cnblogs.com/ieso-ios/p/5064994.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!