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