методы init
и методы, начинающиеся с initWith
, должны возвращать тип id
.
, что обычно происходит, когда у вас есть 2 класса с одинаковым именем метода (инициализатор в данном случае), но различаются по типам возвращаемых данных:
RGBEditView
-(RGBEditView *)initWithFrame:(CGRect)frame H:(float)h S:(float)s B:(float)b;
HSBEditView
-(HSBEditView *)initWithFrame:(CGRect)frame H:(float)h S:(float)s B:(float)b;
alloc
возвращает идентификатор - компилятор предупреждает вас, потому что видит выражение, похожее на присвоение типа, используемое в следующем примере:
RGBEditView * rgb = /* ... */;
HSBEditView * hsb = nil;
hsb = rgb // << compiler: "hey - you don't want to do that unless
// RGBEditView were a subclass of
// HSBEditView... but it's not!"
вы исправляете это, возвращая id
из ваших инициализаторов, например так:
-(id)initWithFrame:(CGRect)frame H:(float)h S:(float)s B:(float)b;
вы возвращаете id, чтобы избежать подобных конфликтов, и поскольку компилятор не знает, какой тип возвращается через alloc
, поэтому каждое объявление подкласса должно будет возвращать другой тип - что приведет только к дополнительным проблемам.
Исключением является использование высококвалифицированных имен, что обычно можно увидеть в удобных конструкторах:
+ (HSBEditView *)newHSBEditViewWithFrame:(CGRect)frame
H:(float)h S:(float)s B:(float)b;