苹果为NSPrintInfo提供的文档部分内容如下:
共享NSPrintInfo对象自动为应用程序创建,默认情况下用于该应用程序的所有打印作业。
方法sharedPrintInfo返回共享的NSPrintInfo。没有明确说明的是,如果您更改该对象(例如,通过使用setOrientation),所述的更改是否与共享对象“粘合”?也就是说,您得到的对象是共享对象的单例副本还是新副本?
我问这个问题的一个原因是,我在苹果的一些示例代码中看到,在打印作业结束时,他们明确地调用了setSharedPrintInfo。如果共享对象是单例,他们为什么要这样做?
更新
看来我的问题还得更清楚些。从苹果的文档中,有一个NSPrintInfo实例是“共享”的。默认情况下,如果在方法调用中没有显式使用NSPrintInfo对象,则使用此“共享”实例。方法sharedPrintInfo返回指向这个“共享”实例的指针。
尚不清楚的是,sharedPrintInfo是克隆“共享”实例并返回指向该实例的指针,还是简单地返回指向现有实例的指针。
如果克隆,那么任何调用(如对setOrientation的调用)都只会影响克隆。如果我也想改变“共享”实例的方向,我必须调用提供修改后的克隆的setSharedPrintInfo作为参数。
如果没有克隆,那么还不清楚为什么苹果的示例代码显式调用setSharedPrintInfo,因为更改sharedPrintInfo返回的NSPrintInfoObject状态的所有方法调用都已经影响了“共享”实例。
发布于 2009-11-12 18:25:24
没有明确说明的是,如果您更改该对象(例如,通过使用setOrientation),所述的更改是否与共享对象“粘合”?也就是说,您得到的对象是共享对象的单例副本还是新副本?
Setter通常返回void;它们不返回您设置其属性的对象。NSPrintInfo的setOrientation:方法就是一个例子。
返回应用更改的接收方副本的方法以其名称显式地表示-例如,stringByAppendingString: (返回修改的副本),而不是appendString: (修改接收方)。
因此,NSPrintInfo的设置程序只影响发送这些消息的对象。如果将setOrientation:发送到共享打印信息,则需要修改该对象;而不是创建新的打印信息。
好了,现在来问你的实际问题。
如果您查看NSDocument,您将看到每个文档都可以有自己的打印信息。当用户进入页面设置时,他们会在文档窗口的工作表中这样做,并且他们的更改只会影响该文档--这只有通过给每个文档提供自己的打印信息才能实现。如果您的应用程序不是基于文档的,它可能是一个单一窗口应用程序,一个打印信息的整个过程将做得很好。
NSDocument的文档调用了一个特定的情况:您可以在您的NSDocument子类中重写它的printInfo方法,以始终使用共享的打印信息对象。我无法想象为什么要这样做,但在这种情况下,共享的打印信息对象实际上是在所有打开的文档之间共享的。
发布于 2009-11-13 03:25:54
尚不清楚的是,sharedPrintInfo是克隆“共享”实例并返回指向该实例的指针,还是简单地返回指向现有实例的指针。
在Cocoa中,sharedFoo方法返回共享foo对象。它不会复制它--这将破坏它的目的,即访问共享对象。
这个规则也适用于defaultFoo方法(例如,[NSFileManager defaultManager])。不要问我为什么他们把这些方法中的一些称为defaultFoo,而另一些则称为sharedFoo。☺
如果您确实想要自己的副本,许多类将允许您创建一个副本;NSPrintInfo是一个显式地允许这样做的示例。其他类(特别是共享面板,如NSColorPanel)只存在于一个实例中。
发布于 2009-11-12 21:55:02
我不知道你的问题的答案,但这里有一个简单的测试来找出:打两次电话给sharedPrintInfo,比较一下指针。如果它们是相同的,那么不,每次都会得到相同的NSPrintInfo对象。如果它们不同,那么每次都会得到不同的对象。您可以在调试器中这样做,并在60秒内得到答案。
https://stackoverflow.com/questions/1723980
复制相似问题