из C++ перспектива:
Я слышал, что когда у вас есть подкласс, вы должны инициализировать суперкласс с тем же инициализации функции внутри инициализации подкласса. Я имею в виду, что init для подкласса должен вызывать [super init], а initWithFrame подкласса должен вызывать [super initWithFrame].
это неправда. это просто обычное дело. вы можете вызывать любой инициализатор суперкласса, который документирован как действительный инициализатор.
это может помочь просмотреть его вот так: Посмотрите на initalizers суперкласса и определите, какие из них поддерживаются.
- иногда есть назначенный инициализатор
- иногда появляется новые Инициализаторы (например, один, который может добавить аргумент в супер-суперкласс)
- иногда бывают инициализаторы унаследованных от супер-суперкласс
для назначенных инициализаторов: считают защищенным
для нового инициализатора: считают защищенным
наследуемых инициализаторов: обычно считают частной, когда суперкласс объявляет новые инициализаторы, иначе защищенный
Почему вызов инициализации супер от initWithFrame результата подкласса в бесконечном цикле?
такой эффект (неопределенное поведение) вызова intializer, который вы не должны вызывать.
Если это требуется, то ли это означает, что я не могу создать новую функцию инициализации в пределах подкласса, таких как initWithPoint и есть инициализации, которые называют супер или в initWithFrame просто потому, что супер класс не имеет initWithPoint?
Это нормально, если вы вызываете один из поддерживаемых инициализаторов суперкласса.
Я думаю, что суть вопроса заключается в том, почему это неправильно, чтобы назвать другой суперкласс, что-то меня путает, возможно, из-за моего фона C++?
objc не поддерживает скрытие/видимость для инициализаторов. как только он находится в интерфейсе суперкласса, он есть (и вы можете делать плохие варианты, когда компилятор не может вам помочь) - вы должны определить график видимости для инициализаторов и соответственно записать свой подкласс. В objc отсутствуют языковые функции, которые вы привыкли иметь на C++.
Я пробовал просмотреть содержимое ссылки для проверки вашего первого абзаца, ссылка не работает. Однако вот мой аргумент: «должен переопределить назначенный инициализатор (ы) суперкласса», звучит излишне (и, следовательно, звучит неверно). Возьмем, например, подкласс UIView, называемый «NamedUIView», где я просто добавляю свойство NSString, называемое именем. Я просто могу: NamedUIView * myView = [[NamedUIView alloc] init]; [myView setName: @ "JeremysView"]. И это будет прекрасно. Мне не нужно переопределять метод init UIView в файле .m-файла NamedUIView, так как в него нечего добавить – pnizzle
Да, Apple любит играть в прятки с URL-адресами. У них, похоже, нет ничего эквивалентного оригиналу; у них была спецификация языка, но теперь у них есть только учебники. Я отредактировал ответ, чтобы уточнить, когда вам нужно переопределить. –