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

posted @ 2015-12-21 21:50  小红烧  阅读(1129)  评论(3编辑  收藏  举报