Соглашения об именах Objective-C - пояснение - PullRequest
3 голосов
/ 22 марта 2012

У меня есть сомнения. Это не очевидно для меня.

Допустим, у нас есть @ свойство с именем myProperty в классе. Мы можем сделать две вещи, синтезируя это. Либо мы можем присвоить ему ivar , скажем _someIVar , либо мы можем просто опустить его, в этом случае компилятор позаботится о создании ivar то же имя, myProperty , для этого свойства. В первом случае мы можем получить доступ к свойству, используя ivar _someIVar . Во втором случае мы можем использовать ivar myProperty , который был создан для нас компилятором.

Теперь я сомневаюсь, что когда мы выталкиваем другой контроллер представления из контроллера представления, который уже находится в стеке навигации, мы используем

[self.navigationController pushViewController:newViewController animated:YES];

Поскольку navigationController является свойством, я предполагаю, что ему должен быть присвоен ivar . Есть только две возможности.

1) Во-первых, Apple имеет соглашение о присвоении имен ивару с предшествующим подчеркиванием (_) . Если это так, я могу вызвать pushViewController: animated: метод, подобный этому,

[_navigationController pushViewController:newViewController animated:YES];

2) Второй возможностью, очевидно, является ивар без подчеркивания,

[navigationController pushViewController:newViewController animated:YES];

Но компилятор не позволяет мне получить доступ к навигационному контроллеру в любом случае. Зачем? Это связано с частной собственностью или с чем-то, или я просто не понимаю Objective-C вообще?

Ответы [ 3 ]

3 голосов
/ 22 марта 2012

Вы не знаете, что Apple сделала для реализации свойства navigationController, поэтому вы не можете просто предположить, что в классе UIViewController есть плавающий ивар _navigationController. Пример: свойство может быть объявлено @dynamic, в этом случае реализация может быть абсолютно любой.

Невозможно угадать, когда ивар поддерживает объект, просто взглянув на само свойство.

2 голосов
/ 22 марта 2012

У нас нет источника для UIKit, поэтому мы не можем однозначно сказать, как называется ивар.

Однако соглашение Apple действительно выглядит как _ivar.

Как это выглядитявляется то, что Apple объявила _navigationController (или как он там может называться) в качестве частного ивара с использованием @private, что означает, что к ивару могут обращаться только экземпляры этого класса, а не подклассы.

Также - этосвойство объявлено только для чтения, поэтому вы даже не можете пытаться записать его, это означает, что Apple действительно не хочет, чтобы вы его изменяли.

Обратите внимание, что у вас есть более двух возможностей для имени ivar.Свойство может быть представлено иваром с любым именем.Если вы посмотрите на документацию Apple, у них есть пример:

@synthesize firstName, lastName, age=yearsOld;

Это указывает, что методы доступа для firstName, lastName и age должны быть синтезированы и что возраст свойства представленпеременная экземпляра yearsOld.

2 голосов
/ 22 марта 2012

Вы не можете угадать по имени ивара. Более того, вы не должны пытаться получить доступ к ivars, объявленным в суперклассах. И в-третьих, нет никакой гарантии, что свойство navigationController полностью поддерживается иваром, оно может быть поддержано специальным геттером, который вычисляет его значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...