我有一個練習來覆蓋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