libs-base/Documentation/manual/AdvancedTopics.texi
CaS 20e890b039 Added objective-c programming manual.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@12373 72102866-910b-0410-8b05-ffd578937521
2002-02-01 16:13:20 +00:00

130 lines
3.5 KiB
Text

@paragraphindent 0
@node Advanced Topics
@chapter Advanced Topics
@cindex advanced topics
@section Forwarding
@cindex forwarding
When an object is unable to respond to a message, the Objective-C
runtime sends a @code{forwardInvocation:} message to the object, and
the object is then able to use the information provided to handle the
message in some way, a common mechanism being to forward the message
to another object known as a @b{delegate}, so that the other object
can deal with it.
@example
- (void) forwardInvocation: (NSInvocation*)objectInvoke
@{
if ([forwardObject respondsToSelector: [objectInvoke selector]])
return [objectInvoke invokeWithTarget: forwardObject];
else
return [self doesNotRecognizeSelector: [objectInvoke selector]];
@}
@end example
@itemize @bullet
@item
@code{objectInvoke} is another object (of the @code{NSInvocation} class)
which has all the information about the original message sent, including
its @b{selector} and its arguments.
@item
@code{self} refers to the object or receiver.
@end itemize
@b{Note. this is a powerful method for creating software patterns for
multiple inheritance, journaling, and dispatching messages to
dynamically loaded code.}
@subsection Forwarding and Multiple Inheritance
Forwarding is a form of multiple inheritance. The diagram below shows a simple scenario where an instance of the @code{Chat} class passes the @b{negotiate} message to an instance of the @code{ChatTwo} class. The forwarding object therefore inherits methods from its own inheritance path and from that of the receiving object.
@subsection Surrogate Objects
Surrogate objects forward messages to objects that can be assumed to be more complex. The @code{forwardInvocation:} method of the surrogate object receives a message that is to be forwarded; it determines whether or not the receiver exists, and if it does not, then it will attempt to create it. A @b{proxy object} is a common example of a surrogate object. A proxy object performs obvious functions that we have already discussed:
@itemize @bullet
@item
provides a local address for a remote object
@item
queues messages
@item
forwards messages to typically remote receivers
@item
copies and retrieves arguments over the connection.
@end itemize
@subsection Forwarding vs Inheritance
The main difference between @b{Forwarding} and @b{Inheritance} surfaces in the application of methods like @code{respondsToSelector} and @code{isKindOfClass:}. This is because these methods search the inheritance path, but ignore the forwarding path.
(See Section 1.6.6 @code{respondsToSelector.})
@b{Note. @code{respondsToSelector} does not trace the forwarding chain, and can therefore erroneously report that an object does not respond to a particular message, when it does.}
@comment Making Forwarding Transparent
@section Exception Handling
@section Copying, Comparing, Hashing Objects
@itemize @bullet
@item
deep copy vs swallow copy
@item
simple copy vs mutable copy
@item
isEqual:, hash
@end itemize
@section Dictionaries, Arrays, Containers
@section Coding
@itemize @bullet
@item
Possibilities offered by Coding
@item
Type Encoding
@end itemize
@section Property Lists
@itemize @bullet
@item
What are property lists
@end itemize
@section Bundles
@section UserDefaults
@section Threading
General discussion about threading with gnustep base, what is
thread-safe, what is not, how to start new threads, NSThread briefly
introduced with examples.
[Nicola: important: talk about NSConnection enableMultipleThreads]].