Почему UIView вызывает как init, так и initWithFrame?

Я заметил, что когда я переопределяю как init и initWithFrame: в подклассах UIView оба метода. Несмотря на то, что только один вызов явно указан в моем коде:

TestViewController.m:

 @implementation TestViewController - (void)viewDidLoad { [super viewDidLoad]; View1 *view1 = [[View1 alloc] init]; [self.view addSubview:view1]; } @end 

View1.m:

 @implementation View1 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { NSLog(@"initWithFrame"); } return self; } - (id)init { self = [super init]; if (self) { NSLog(@"init"); } return self; } @end 

Консоль выглядит так:

2013-10-17 12: 33: 46.209 test1 [8422: 60b] initWithFrame

2013-10-17 12: 33: 46.211 test1 [8422: 60b] init

Почему initWithFrame вызывается до init?

3 Solutions collect form web for “Почему UIView вызывает как init, так и initWithFrame?”

Причина в том, что внутри View1 initWithFrame: вы вызываете [super initWithFrame:] . UIView initWithFrame : вызывает [self init] .

Когда вы вызываете метод внутри класса, вызывается метод в самом подклассе. Итак, когда вы вызываете метод экземпляра (например, init) в UIView, он пытается вызвать метод init в View1 (если он реализован).

EDIT в соответствии с ответом ниже: https://stackoverflow.com/a/19423494/956811

Пусть view1 является экземпляром View1.
Иерархия вызовов:

  - [view1(View1) init] - [view1(UIView) init] (called by [super init] inside View1) - [view1(View1) initWithFrame:CGRectZero] (called inside [view(UIView) init] ) - [view1(UIView) initWithFrame:CGRectZero] (called by [super initWithFrame] inside View1) - ... - NSLog(@"initWithFrame"); (prints "test1[8422:60b] initWithFrame") - NSLog(@"init"); (called inside [view1(View1) init] ; prints "test1[8422:60b] init") 

Проверьте наследование в ООП.

http://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)

http://www.techotopia.com/index.php/Objective-C_Inheritance

Это не проблема. В случае UIView вызов [super init] будет автоматически изменен на [super initWithFrame:CGRectZero] . Поэтому вы должны поддерживать этот код, сохраняя это в виду.

Ниже приведено небольшое описание обоих методов, которые будут четко определять, почему init будет вызываться после initWithFrame: –

Какой метод initWithFrame?

 Initializes and returns a newly allocated NSView object with a specified frame rectangle. This method returns the initialize and allocated object. Once it returned the below init method will called automatically. 

Какой метод инициализации?

  Implemented by subclasses to initialize a new object (the receiver) immediately after memory for it has been allocated.So this init method will called only when memory has been allocated to the object by initwithFrame. 
  • UIToolbar animate alpha ios7
  • iOS - перемещение UITextField в другую позицию при перемещении UIView
  • Скрыть нижнюю планку по требованию
  • Как сделать метод «touchhesBegan» работать для определенного вида?
  • Определение того, находится ли точка в представлении в пределах подзонов
  • iOS - Контроллер PageView с ошибкой изменения UITableView
  • Четкий ответ о том, как маскировать UIView как выбранный UITableViewCellBackgroundView
  • cornerRadius не работает, если заменить представление по умолчанию на пользовательский подкласс
  • Повернуть (угол) UIView, используя атрибуты времени выполнения, определенные пользователем
  • Круглые определенные углы и показ тени только на определенных сторонах
  • Установка фонового цвета подкласса UIView не работает
  • Использование UIView в качестве кнопки
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.