Почему 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?

Причина в том, что внутри 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. 
  • Отправить UIImage в LocalwebServer с помощью GCDWebServer
  • Sublassing NSMutableAttributedString возвращает SIGABRT в init
  • Когда источники приложения должны быть включены в тестовые цели?
  • Разбор каждого элемента массива вместе - iOS
  • Как правильно линеаризовать глубину в OpenGL ES в iOS?
  • Как вставить новую строку \ n из текста UILabel, который был введен в IB?
  • Изменение вертикального положения UIBarButtonItem на iOS 8.2
  • Файл isignal / onesignal.h не найден
  • iOS Instagram Tags Text Layout? Как это делается?
  • LinkedIn ios SDK - аутентификация пользователя, если пользователь не хочет загружать мобильное приложение из магазина приложений
  • Отключить / включить UIButton
  • Interesting Posts

    Приложение ios для разблокировки сна / разговора?

    Портал обеспечения IOS – устройство не уникально

    Как приложение Mail IOS может оповестить о новой почте, пока она не запущена

    Как создать пустое приложение в Xcode 6 без раскадровки

    Приложение сбой в потоке с именем com.apple.CFURLCACHE_work_queue

    AVAudioPlayerNode lastRenderTime

    как получить токен устройства в iOS?

    Можно ли использовать перетаскивание iOS 11 для переупорядочения нескольких элементов / ячеек за раз в UITableView?

    Есть ли способ сравнить CGPoints?

    Предварительный просмотр встроенных ссылок в приложении iOS, как Facebook

    Локализованный проект с несколькими объектами с локализованными именами приложений

    Iphone Facebook IOS Загрузка изображений, занимающих слишком много времени?

    Безопасный dealloc объекта ObjC на устройстве iOS

    FBSDKShareDialog отменяет, когда он должен опубликовать

    IOS сгруппированные прозрачные ячейки tableview

    Давайте будем гением компьютера.