我有一个练习来覆盖init方法,所以我需要创建一个init
方法来设置一些属性。重写`init`方法时,为什么重新定义它很重要?
我的问题是:为什么我还需要定义原始的init
方法?如果新的init
方法不起作用?
这是我.h
文件:
#import <Foundation/Foundation.h>
#import "XYPoint.h"
@interface Rectangle: NSObject
@property float width, height, tx, ty;
-(XYPoint *) origin;
-(void) setOrigin: (XYPoint *) pt;
-(void) translate: (XYPoint *) point;
-(id) initWithWidth:(int) w andHeight:(int) h;
-(id) init;
@end
而且.m
(仅在init方法):
-(id) initWithWidth:(int)w andHeight:(int)h
{
self = [super init];
if (self)
{
[self setWidth:w andHeight:h];
}
return self;
}
-(id) init
{
return [self initWithWidth:0 andHeight:0];
}
我知道,这是很好的这种方式,但如果有人能解释我为什么我将不胜感激。
谢谢分配!为什么这些方法需要返回'id'类型?如果我知道什么类型会叫他们..? @Anurag – MNY 2013-02-18 06:16:08
保留返回类型'id'具有在子类化时自动转换为正确类型的灵活性,并且这种情况发生在编译时,所以如果您尝试调用实例方法,则会收到警告/错误在调用'alloc'的类中不存在的返回对象。希望我不会进一步混淆事物。但是,请记住,此编译器仅检查实例方法而不检查类方法。 – Anurag 2013-02-18 06:25:29
更好地使用实例类型,因为当你使用'id'时,根本就没有类型检查。使用instancetype,编译器和IDE知道返回什么类型的东西,并且可以更好地检查代码并更好地自动完成。 – Bernard 2016-07-15 11:37:14