NSPrintInfo的sharedPrintInfo究竟是如何共享的?

时间:2009-11-12 17:31:03

标签: objective-c cocoa printing

Apple的NSPrintInfo文档部分说明:

  

为应用程序自动创建共享的NSPrintInfo对象,默认情况下用于该应用程序的所有打印作业。

方法sharedPrintInfo返回共享的NSPrintInfo。没有明确说明的是,如果你改变那个对象(例如,通过使用setOrientation),那么所做的改动会“粘贴”共享对象吗?即,您获取单个共享对象的单个副本或新副本的对象是什么?

我问的一个原因是因为我在Apple的一些示例代码中看到他们在打印作业结束时明确调用setSharedPrintInfo。如果共享对象是单例,他们为什么这样做呢?

更新

在我的问题中,我似乎必须更清楚。从Apple的文档中,存在NSPrintInfo的实例,即“共享”实例。在方法调用中没有显式使用NSPrintInfo对象时,默认情况下使用此“共享”实例。方法sharedPrintInfo返回指向此“共享”实例的指针。

不清楚的是sharedPrintInfo是否克隆了“共享”实例并返回指向该实例的指针,或者只是返回指向现有实例的指针。

如果克隆,则任何调用(例如setOrientation之一)都只会影响克隆。如果我也想改变“共享”实例的方向,我必须调用setSharedPrintInfo提供更改后的克隆作为参数。

如果没有克隆,那么不清楚为什么Apple的示例代码显式调用setSharedPrintInfo,因为所有方法调用都会改变NSPrintInfoObject返回的sharedPrintInfo的状态已经影响了“共享”实例

5 个答案:

答案 0 :(得分:2)

  

未明确说明的是,如果您更改该对象(例如,通过使用setOrientation),那么所做的更改会“粘贴”共享对象吗?即,您获取单个共享对象的单个副本或新副本的对象是什么?

Setters通常会返回void;它们不会返回您设置其属性的对象。 NSPrintInfo的setOrientation:方法就是一个例子。

返回应用了更改的接收者副本的方法在名称中明确说明 - 例如,stringByAppendingString:(返回修改后的副本),而不是appendString:(修改接收者)

因此NSPrintInfo的setter只会影响你发送这些消息的对象。如果将setOrientation:发送到共享打印信息,则修改该对象;您没有创建新的打印信息。

好的,现在是你的实际问题。

如果查看NSDocument,您会看到每个文档都有自己的打印信息。当用户进入页面设置时,他们在文档窗口的工作表中这样做,并且他们的更改仅影响该文档 - 这只能通过为每个文档提供自己的打印信息来实现。如果你的应用程序不是基于文档的,它可能是一个单窗口应用程序,整个过程的一个打印信息就可以了。

NSDocument的文档调出了一个特定情况:您可以在NSDocument子类中覆盖其printInfo方法,以始终使用共享打印信息对象。我无法想象为什么你会这样做,但在这种情况下,共享的打印信息对象字面在所有打开的文档之间共享。

答案 1 :(得分:1)

  

不清楚的是sharedPrintInfo是否克隆“共享”实例并返回指向该实例的指针,或者只是返回指向现有实例的指针。

在Cocoa中,sharedFoo方法返回共享的foo对象。它没有复制它 - 这会破坏它的目的,即访问共享对象。

此规则对defaultFoo方法也适用(例如[NSFileManager defaultManager])。不要问我为什么他们称这些方法为defaultFoo和其他sharedFoo。 ☺

如果你真的想要自己的副本,许多课程会让你制作一个; NSPrintInfo是明确允许这样做的一个例子。其他类(特别是共享面板,例如NSColorPanel)存在于一个且仅有一个实例中。

答案 2 :(得分:0)

我不知道你的问题的答案,但这是一个简单的测试,找出:两次调用sharedPrintInfo并比较指针。如果它们是相同的,那么不,每次都会得到相同的NSPrintInfo对象。如果它们不同,那么每次都会得到一个不同的对象。您可以在调试器中执行此操作,并在六十秒内得到答案。

答案 3 :(得分:0)

我没有试过这个,所以如果我错了,请随意向我投票。

NSPrintInfo文档说明了以下内容,这看起来很清楚:

  

为应用程序自动创建共享的NSPrintInfo对象   默认情况下用于该应用程序的所有打印作业。

     

您还可以使用initWithDictionary:方法初始化此类的实例。   您可以使用此词典存储与打印作业关联的自定义信息。

这表明您可以使用共享对象或创建自己的对象。

现在问题的第二部分,为什么Apple示例会调用setSharedPrintInfo:

如果您使用initWithDictionary:创建自己的,则可以将其存储为新的共享。但你没必要。

来源:Mac Dev Center, NSPrintInfo Class Reference

答案 4 :(得分:-2)

这不是单身人士。有一个共享的NSPrintInfo对象,因为大多数应用只需要一个。如果适合您的情况,您还可以创建其他NSPrintInfo实例。