с точки зрения c ++:
Я слышал, что когда у вас есть подкласс, вы должны инициализировать суперкласс той же функцией init из инициализации подкласса.Я имею в виду, что init подкласса должен вызывать [super init], а initWithFrame подкласса должен вызывать [super initWithFrame].
, это не так.это просто обычное дело.Вы можете вызывать любой инициализатор суперкласса, который задокументирован как действительный инициализатор.
это может помочь просмотреть его так: посмотрите на инициализаторы суперкласса и определите, какие из них поддерживаются.
- иногда есть назначенный инициализатор
- иногда появляются новые инициализаторы (например, такие, которые могут добавить аргумент в супер-суперкласс)
- иногда есть инициализаторы, унаследованные от супер-суперкласса
для обозначенных инициализаторов: считайте его защищенным
для нового инициализатора: считайте его защищенным
для унаследованных инициализаторов: обычно считайте закрытым, когдасуперкласс объявляет новые инициализаторы, иначе защищенные
Почему вызов init суперкадра из initWithFrame подкласса приводит к бесконечному циклу?
таков эффект (неопределенное поведение)вызов интилизатора, который вы не должны вызывать.
Если это необходимо, тоОзначает ли это, что я не могу создать новую функцию init внутри подкласса, такого как initWithPoint, и иметь этот вызов super init или initWithFrame просто потому, что у суперкласса нет initWithPoint?
это хорошо, какПока вы звоните через один из поддерживаемых инициализаторов суперкласса.
Я думаю, суть вопроса здесь просто в том, почему неправильно вызывать другой суперкласс, что меня смущает, возможно, из-за моего c ++background?
objc не поддерживает скрытие / видимость для инициализаторов.как только он находится в интерфейсе суперкласса, он там (и вы можете сделать неправильный выбор, когда компилятор не может вам помочь) - вы должны определить граф видимости для инициализаторов и написать свой подкласс соответственно.В objc отсутствуют языковые функции, которые вы привыкли иметь в c ++.