Почему 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. 
  • Включить полноэкранное действие с двойным нажатием
  • Какова связь между началом кадра в UIView и его центром?
  • AVCaptureVideoPreviewLayer не работает с renderInContext
  • Предоставление UIView в PDF как векторы на iPad - Иногда отображается как растровое изображение, иногда как векторы
  • Как сделать фон UIToolbar прозрачным?
  • Как оживить UIView, идущий с экрана вправо, а затем снова появиться слева
  • UIButton с изображением, установленным в UIViewContentModeScaleAspectFill, полностью не заполняется маленькими изображениями
  • iOS: UIView размывает все, что движется за ним
  • Как получить ширину основного UIView в ландшафтном режиме?
  • Захват UIImage UIView, включая UINavigationBar
  • UIView bringSubviewToFront: делает * не * обеспечивает просмотр спереди
  • Interesting Posts

    UIScrollView блокирует цикл цикла?

    Учебник по созданию функций чата с Swift с использованием Layer?

    В чем разница между различными типами заполнения в iOS?

    Ярлык для xcode «вернуться к последнему месту» в том же файле?

    Apple Mach-O Linker (ld) Группа ошибок с Swift 3 и Xcode 9 GM

    GCDAsyncSocket не подключается или не дает мне знать об ошибке

    Пробелы в UIWebView

    Лучший дизайн для плавающего вида, который будет следовать за центральной ячейкой таблицы, таблицы поиска видеороликов

    Тип не имеет подписчиков?

    Ошибка при интеграции SDK Google Analytics (GoogleAnalyticsiOS_2.0beta4) в приложении iOS

    Xamarin Forms IOS Не удалось загрузить сборку System.Net.Http.Primitive

    ios проверяет, отключено ли пользователем push-уведомления

    View Controller отправляет сообщение, даже если оно было освобождено

    ios: локализовать имя emoji (kCFStringTransformToUnicodeName)

    ошибка 401, когда я запрашиваю все контакты с помощью GDATA

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.