Как именно NSPrintInfo разделяет sharedPrintInfo? - PullRequest
2 голосов
/ 12 ноября 2009

Документация Apple для NSPrintInfo гласит:

Общий объект NSPrintInfo автоматически создается для приложения и используется по умолчанию для всех заданий печати для этого приложения.

Метод sharedPrintInfo возвращает общий NSPrintInfo. Что конкретно не указано, так это то, что если вы изменяете этот объект (например, используя setOrientation), эти изменения "прилипают" к общему объекту? То есть, объект, который вы получаете обратно - одиночка или свежая копия общего объекта?

Одна причина, которую я спрашиваю, заключается в том, что я видел в некоторых примерах кода Apple, где они явно вызывают setSharedPrintInfo в конце задания на печать. Зачем они это делают, если разделяемый объект является одноэлементным?

Обновление

Кажется, мне нужно прояснить вопрос. Из документации Apple существует экземпляр NSPrintInfo, который является «общим». Этот «общий» экземпляр используется по умолчанию, если в вызовах методов явно не используется объект NSPrintInfo. Метод sharedPrintInfo возвращает указатель на этот «общий» экземпляр.

Неясно, клонирует ли sharedPrintInfo «общий» экземпляр и возвращает ли на него указатель или просто возвращает указатель на существующий экземпляр.

Если клонировать, то любой вызов, например, один на setOrientation, повлияет только на клон. Если бы я также хотел изменить ориентацию «общего» экземпляра, мне пришлось бы вызвать setSharedPrintInfo, указав в качестве аргумента измененный клон.

Если не клонировать, то неясно, почему образец кода Apple явно вызывает setSharedPrintInfo, потому что все вызовы методов, изменяющие состояние NSPrintInfoObject, возвращаемое sharedPrintInfo, уже влияли на «общий» экземпляр.

Ответы [ 5 ]

2 голосов
/ 12 ноября 2009

Что не указано явно, если вы изменяете этот объект (например, с помощью setOrientation), эти изменения "прилипают" к общему объекту? То есть, объект, который вы получаете обратно - одиночка или свежая копия общего объекта?

Сеттеры обычно возвращают void; они не возвращают объект, свойство которого вы установили. Метод setOrientation: NSPrintInfo является одним из примеров.

Методы, которые возвращают копию получателя с примененным изменением, прямо говорят об этом в своем имени - например, stringByAppendingString: (возвращает измененную копию), в отличие от appendString: (изменяет получатель).

Таким образом, сеттеры NSPrintInfo влияют только на объект, на который вы отправляете эти сообщения. Если вы отправляете setOrientation: в общую информацию для печати, вы изменяете этот объект; Вы не создаете новую информацию для печати. ​​

ОК, теперь ваш актуальный вопрос.

Если вы посмотрите на NSDocument, вы увидите, что каждый документ может иметь свою собственную информацию для печати. Когда пользователь входит в Параметры страницы, он делает это на листе в окне документа, и его изменения влияют только на этот документ - что возможно только при предоставлении каждому документу собственной информации для печати. Если ваше приложение не основано на документах, это, вероятно, приложение с одним окном, и одна информация о печати для всего процесса будет работать нормально.

Документация по NSDocument вызывает один конкретный случай: вы можете переопределить его метод printInfo в своем подклассе NSDocument, чтобы всегда использовать совместно используемый объект информации для печати. Я не могу себе представить, почему вы это сделали, но в этом случае общий информационный объект для печати буквально используется всеми открытыми документами.

1 голос
/ 13 ноября 2009

Неясно, клонирует ли sharedPrintInfo «разделяемый» экземпляр и возвращает ли на него указатель или просто возвращает указатель на существующий экземпляр.

В Какао метод sharedFoo возвращает общий объект foo. Он не делает его копию - это нарушило бы его цель - доступ к общему объекту.

Это правило также справедливо для defaultFoo методов (например, [NSFileManager defaultManager]). Не спрашивайте меня, почему они называют некоторые из этих методов defaultFoo, а другие sharedFoo. ☺

Если вам когда-нибудь понадобится ваша собственная копия, многие классы позволят вам сделать ее; NSPrintInfo - один из примеров, который явно разрешает это. Другие классы (в частности, общие панели, такие как NSColorPanel) существуют в одном-единственном экземпляре.

0 голосов
/ 13 ноября 2009

Я не пробовал этого, так что не стесняйтесь, проголосуйте за меня, если я совершенно неправ.

Документация NSPrintInfo гласит следующее, что кажется довольно ясным:

Для приложения автоматически создается общий объект NSPrintInfo. и используется по умолчанию для всех заданий на печать для этого приложения.

Вы также можете инициализировать экземпляр этого класса, используя метод initWithDictionary:. Вы можете использовать этот словарь для хранения пользовательской информации, связанной с заданием на печать.

Это будет означать, что вы можете использовать общий объект ИЛИ создать свой собственный.

Теперь ко второй части вашего вопроса, почему примеры Apple называют setSharedPrintInfo:?

Если вы создаете свой собственный, используя initWithDictionary:, вы МОЖЕТЕ сохранить его, чтобы он стал новым общим. Но ты не обязан.

источник: Mac Dev Center, справочник по классам NSPrintInfo

0 голосов
/ 13 ноября 2009

Я не знаю ответа на ваш вопрос, но вот простой тест, чтобы узнать: дважды позвоните по номеру sharedPrintInfo и сравните указатели. Если они одинаковые, то нет, каждый раз вы возвращаете один и тот же объект NSPrintInfo. Если они разные, то каждый раз вы получаете новый предмет. Вы можете сделать это в отладчике и получить ответ через шестьдесят секунд.

0 голосов
/ 12 ноября 2009

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

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