Apple的NSPrintInfo文档部分说明:
为应用程序自动创建共享的NSPrintInfo对象,默认情况下用于该应用程序的所有打印作业。
方法sharedPrintInfo
返回共享的NSPrintInfo
。没有明确说明的是,如果你改变那个对象(例如,通过使用setOrientation
),那么所做的改动会“粘贴”共享对象吗?即,您获取单个共享对象的单个副本或新副本的对象是什么?
我问的一个原因是因为我在Apple的一些示例代码中看到他们在打印作业结束时明确调用setSharedPrintInfo
。如果共享对象是单例,他们为什么这样做呢?
在我的问题中,我似乎必须更清楚。从Apple的文档中,存在NSPrintInfo
的实例,即“共享”实例。在方法调用中没有显式使用NSPrintInfo
对象时,默认情况下使用此“共享”实例。方法sharedPrintInfo
返回指向此“共享”实例的指针。
不清楚的是sharedPrintInfo
是否克隆了“共享”实例并返回指向该实例的指针,或者只是返回指向现有实例的指针。
如果克隆,则任何调用(例如setOrientation
之一)都只会影响克隆。如果我也想改变“共享”实例的方向,我必须调用setSharedPrintInfo
提供更改后的克隆作为参数。
如果没有克隆,那么不清楚为什么Apple的示例代码显式调用setSharedPrintInfo
,因为所有方法调用都会改变NSPrintInfoObject
返回的sharedPrintInfo
的状态已经影响了“共享”实例
答案 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:
创建自己的,则可以将其存储为新的共享。但你没必要。
答案 4 :(得分:-2)
这不是单身人士。有一个共享的NSPrintInfo对象,因为大多数应用只需要一个。如果适合您的情况,您还可以创建其他NSPrintInfo实例。