Эта установка потенциально хрупкая, и предложение Джо, присваивающее self
в initWithComponentRed:...
перед возвратом этого значения, исправит это.
Каждый метод получает аргумент self
, который указывает на экземпляр, к которому он был вызван. Аргумент действует так же, как любая другая переменная; в этом нет ничего особенного. Вот почему можно присвоить self
, и поэтому необходимо иметь явный return
в инициализаторах.
Когда вы отправляете [super init]
, вы используете версию суперкласса метода init
, но текущий экземпляр все равно будет передан как self
. Поскольку инициализаторам в Objective-C разрешено уничтожать полученный ими объект, а также создавать и возвращать новый, * существует вероятность того, что self = [super init]
в initWithColor:
не будет тем же объектом, на который указывает self
назад в initWithComponentRed:...
.
Если это произойдет, поскольку вы не переназначаете self
для указания на этот новый, правильно инициализированный объект, вы будете возвращать неинициализированный объект из initWithComponentRed:...
.
Это практическая проблема, если ваш суперкласс мог бы выполнить замену, которую я описал, но также нет причины, AFAIK, не делать это переназначение.
* Коллекции делают это, например, потому что они не знают, насколько большим они должны быть в alloc
время; Я считаю, что NSNumber
также делает это, потому что он кэширует значения для экземпляров, представляющих маленькие целые числа.