Getting a Vended Object
An application gets a vended object by creating a proxy, or a stand-in, for that object in its own address space. The proxy forwards messages sent to it through its
NSConnection object back to the vended object. An application can get a proxy for a vended object in two ways. First, the
rootProxyForConnectionWithRegisteredName:host: class method returns the proxy directly:
theProxy = [[NSConnection
This message returns a proxy to the root object of the
NSConnection object named “server”. The
nil host name indicates that only the local host is searched for a registered
NSConnection object; you can specify a specific host name to restrict the server to an identified host.
The invocation of
setProtocolForProxy: informs the distributed objects system of the set of messages that theProxy responds to. Normally, the first time a particular selector is forwarded by a proxy the
NSConnection object must confirm the argument and return types with the real object. This can add significant overhead to distributed messages. Setting a protocol records this information so that no confirmation is needed for the messages in the protocol, and only the message forwarding costs are incurred.
Another way to get a proxy is to get an
NSConnection object to the server and then ask for the proxy of its root object:
theConnection = [NSConnection connectionWithRegisteredName:@"server"
theProxy = [[theConnection rootProxy] retain];
This is useful if you need to interact with the
NSConnection object as well as the proxy. (However, note that theConnection is not retained in this example.)
NSConnection object spawns a child
NSConnection object to handle communication between two applications (
s/a in Figure 1). Though the child
NSConnection object does not have a name, it shares the root object and other configuration attributes of its parent, but not the delegate. You should not register a child
NSConnection object with a name or change its root object, but you can change its other attributes, as described in Configuring a Connection.
By default, messages sent to a proxy object are forwarded over the connection synchronously; that is, the sender waits for the message to be processed and a reply received from the remote object. This occurs even for a method with a
void return type, since the remote object can raise an exception that is passed back to the sender. The local thread or application thus blocks until the message completes execution. To avoid this, you can declare the method type as
oneway void to cause asynchronous messaging. For more details, see the “Remote Messaging” section of The Runtime System in The Objective-C Programming Language.