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


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

本站声明
本文转载自:http://www.cnblogs.com/ieso-ios/p/5064994.html     作者:小红烧     发布日期:2015-12-21     本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。


 
© 2014-2016 ITdaan.com 粤ICP备14056181号