Каждый экземпляр получается откуда-то и по чьему-то требованию. В частности, один объект посылает сообщение другому объекту с требованием получить, прежде всего, такой экземпляр.

Следовательно, у запрашивающего объекта в данный момент имеется ссылка на требуемый экземпляр. Когда объект Manny формирует объект Jack, у него имеется ссылка на объект Jack.

Этот простой факт может послужить в качестве отправной точки для установления будущей связи между объектами. Если объект Manny формирует объект Jack и ему заранее известно, что в дальнейшем ему потребуется ссылка на объект Jack, то объект Manny может сохранить ссылку, полученную, прежде всего, при формировании объекта Jack. С другой стороны, объекту Manny может быть известно, что объекту Jack в дальнейшем потребуется ссылка на объект Manny. В таком случае объект Manny может предоставить эту ссылку сразу же после формирования объекта Jack, а затем объект Jack сохранит ее.

Характерным тому примером служит делегирование. Объект Manny может создать объект Jack и сразу же сделать себя его делегатом. На самом деле объект Jack можно наделить, если это очень важно, инициализатором, чтобы объект Manny мог создать объект Jack и одновременно передать ему ссылку на себя во избежание любых оплошностей. Сравните это с подходом, принятым в классах UIActionSheet и UIAlertView, где делегат является одним из параметров инициализатора, или же в классе UIBarButtonltem, где цель является одним из параметров инициализатора.

Делегирование — это лишь один пример. Когда объект Manny создает объект Jack, последнему может понадобиться ссылка не на объект Manny, а на нечто известное или имеющееся у этого объекта. По-видимому, объект Jack можно наделить методом, чтобы объект Manny мог передать информацию, требующуюся объекту Jack. Опять же этот метод, возможно, стоит сделать инициализатором объекта Jack, если подобная информация жизненно важна для данного объекта.

Приведенный ниже пример кода взят из контроллера табличного представления одного из моих приложений. Когда пользователь выбирает строку таблицы постукиванием

пальцем по ней, создается контроллер вторичного табличного представления (экземпляр класса TrackViewController), которому передаются требующиеся ему данные, а затем отображается табличное представление. Класс TrackViewController был намеренно разработан вместе со специальным инициализатором initWithMedialtemCollection:, чтобы сделать его буквально обязанным получить доступ к данным, требующимся контроллеру типа TrackViewController с момента начала его существования.

- (void)showItemsForRow: (NSIndexPath*)    indexPath {

II создать подтаблицу дорожек звукозаписи и перейти к ней TrackViewController *t =

[[TrackViewController alloc] initWithMedialtemCollection:

(self.albums)[indexPath.row]];

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

}

В данном примере объект self не хранит ссылку на новый экземпляр класса Track ViewController, а объект типа TrackViewController не приобретает ссылку на объект self. Тем не менее объект self создает экземпляр класса TrackViewController, и поэтому на какое-то мгновение получает ссылку на него. Следовательно, объект self выгодно использует данный момент, чтобы передать экземпляру класса TrackViewController нужную ему информацию, поскольку трудно найти более подходящий для этого момент. Искусство передачи данных отчасти состоит в том, чтобы знать, когда наступит подходящий момент, и не пропустить его.

При загрузке nib-файла его владелец, по существу, получает экземпляры объектов в nib-файле. (Владельцем файла с расширением .xib является объект, представленный заместителем владельца файла в nib-файле, а владельцем раскадровки — контроллер представления верхнего уровня; см. главу 7). Подготавливая в nib-файле выходы от владельца этого файла, вы тем самым устраиваете получение владельцем nib-файла ссылок на экземпляры nib-объектов в тот момент, когда они получаются посредством механизма загрузки nib-файлов.

Несколько другая архитектура возникает, когда объект Manny получает экземпляр объекта Jack, а объект Мое его не получает. В то же время у объекта Мое есть ссылка на объект Manny, и объекту Мое известно, что у объекта Manny есть информация, которой он может поделиться с объектом Jack. Следовательно, объект Мое связывает вместе объекты Manny и Jack. Это подходящий момент для объекта Manny.

Например, начинающих программировать в операционной системе iOS нередко озадачивает, что объекты могут получить ссылки друг на друга, если их экземпляры будут получены из разных nib-файлов, например, разных файлов с расширением . xib или сцен в раскадровке. Жаль, что нельзя установить связь между объектом в nib-файле А и объектом в nib-файле В. Особенно жаль, когда оба объекта оказываются в одной раскадровке. Как пояснялось во врезке “Связи между nib-файлами” в главе 7, такая связь может быть бесполезной, именно поэтому она и невозможна. Тем не менее один объект (Manny) может стать владельцем загружаемого nib-файла А, а другой объект (Jack) — владельцем загружаемого nib-файла В. Тогда им, возможно, удастся увидеть друг друга. В этом случае затруднение разрешается при наличии всех необходимых выходов. Возможно, какому-нибудь третьему объекту (Мое) удастся увидеть оба эти объекта и предоставить им путь для связи.

Именно это и происходит в раскадровке. Когда в раскадровке начинается переход, получается экземпляр контроллера целевого представления этого перехода, а сам переход получает ссылку на него. В то же время контроллер исходного представления уже существует, а у перехода имеется также ссылка на него. Таким образом, переход посылает контроллеру исходного представления сообщение prepareForSegue: sender:, содержащее ссылку на самого себя (т.е. на этот переход).

В данном случае переход выступает в роли объекта Мое, связывая вместе объекты Manny (контроллер исходного представления) и Jack (контроллер целевого представления). При этом у контроллера исходного представления появляется удобный момент (как и у объекта Manny) получить ссылку на новый экземпляр контроллера целевого представления, стать делегатом этого контроллера, передать ему любую требующуюся информацию и т.д. (Если создать проект по шаблону Utility Application, то можно обнаружить, что именно это и происходит в исходном коде класса MainViewController.)


 

 

 

Добавить комментарий