libs-base/Documentation/gsdoc/NSObject.html
CaS fa6f34e403 Document deallocation notifications
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@11402 72102866-910b-0410-8b05-ffd578937521
2001-11-13 17:37:13 +00:00

697 lines
25 KiB
HTML

<html><head>
<title>NSObject</title>
</head>
<body>
<a href ="NSNumberFormatter.html">[Previous] </a>
<a href ="Base.html">[Up] </a>
<a href ="NSPipe.html">[Next] </a>
<h1>NSObject</h1>
<h3>Authors </h3>
<dl>
<dt><a href ="http://www.gnustep.org/developers/whoiswho.html">Richard Frith-Macdonald</a>
<dd>
<dt><a href ="http://www.gnustep.org/developers/whoiswho.html">Nicola Pero</a>
<dd>
</dl>
<p>Version: $Revision$</p>
<p>Date: $Date$</p>
<h2><a name ="cont-0">NSObject</a></h2>
<h2><a name ="NSObject">NSObject</a></h2>
<p><b>Declared in: </b> Foundation/NSObject.h</p>
<p><b>Conforms to: </b> NSObject
</p>
<hr>
<p>
<code>NSObject</code> is the root class (a root class is
a class with no superclass) of the gnustep base library
class hierarchy, so all classes normally inherit from
<code>NSObject</code>. There is an exception though:
<code>NSProxy</code> (which is used for remote messaging)
does not inherit from <code>NSObject</code>.
</p>
<p>
Unless you are really sure of what you are doing, all
your own classes should inherit (directly or indirectly)
from <code>NSObject</code> (or in special cases from
<code>NSProxy</code>). <code>NSObject</code> provides
the basic common functionality shared by all gnustep
classes and objects.
</p>
<p>
The essential methods which must be implemented by all
classes for their instances to be usable within gnustep
are declared in a separate protocol, which is the
<code>NSObject</code> protocol. Both
<code>NSObject</code> and <code>NSProxy</code> conform to
this protocol, which means all objects in a gnustep
application will conform to this protocol (btw, if you
don't find a method of <code>NSObject</code> you are
looking for in this documentation, make sure you also
look into the documentation for the <code>NSObject</code>
protocol).
</p>
<p>
Theoretically, in special cases you might need to
implement a new root class. If you do, you need to make
sure that your root class conforms (at least) to the
<code>NSObject</code> protocol, otherwise it will not
interact correctly with the gnustep framework. Said
that, I must note that I have never seen a case in which
a new root class is needed.
</p>
<p>
<code>NSObject</code> is a root class, which implies that
instance methods of <code>NSObject</code> are treated in
a special way by the Objective-C runtime. This is an
exception to the normal way messaging works with class
and instance methods: if the Objective-C runtime can't
find a class method for a class object, as a last resort
it looks for an instance method of the root class with
the same name, and executes it if it finds it. This
means that instance methods of the root class (such as
<code>NSObject</code>) can be performed by class objects
which inherit from that root class ! This can only
happen if the class doesn't have a class method with the
same name, otherwise that method - of course - takes the
precedence. Because of this exception,
<code>NSObject</code>'s instance methods are written in
such a way that they work both on <code>NSObject</code>'s
instances and on class objects.
</p>
<h2>Instance Variables </h2>
<ul>
</ul>
<h2>Methods </h2>
<ul>
<li ><a href ="NSObject.html#method-0">+alloc</a>
<li ><a href ="NSObject.html#method-1">+allocWithZone:</a>
<li ><a href ="NSObject.html#method-2">+cancelPreviousPerformRequestsWithTarget:selector:</a>
<li ><a href ="NSObject.html#method-3">+class</a>
<li ><a href ="NSObject.html#method-4">+conformsToProtocol:</a>
<li ><a href ="NSObject.html#method-5">+copyWithZone:</a>
<li ><a href ="NSObject.html#method-6">+description</a>
<li ><a href ="NSObject.html#method-7">+descriptionWithLocale:</a>
<li ><a href ="NSObject.html#method-8">+descriptionWithLocale:indent:</a>
<li ><a href ="NSObject.html#method-9">+descriptionWithLocale:indent:to:</a>
<li ><a href ="NSObject.html#method-10">+initialize</a>
<li ><a href ="NSObject.html#method-11">+instanceMethodForSelector:</a>
<li ><a href ="NSObject.html#method-12">+instanceMethodSignatureForSelector:</a>
<li ><a href ="NSObject.html#method-13">+instancesRespondToSelector:</a>
<li ><a href ="NSObject.html#method-14">+load</a>
<li ><a href ="NSObject.html#method-15">+mutableCopyWithZone:</a>
<li ><a href ="NSObject.html#method-16">+new</a>
<li ><a href ="NSObject.html#method-17">+poseAsClass:</a>
<li ><a href ="NSObject.html#method-18">+setVersion:</a>
<li ><a href ="NSObject.html#method-19">+superclass</a>
<li ><a href ="NSObject.html#method-20">+version</a>
<li ><a href ="NSObject.html#method-47">-_dealloc</a>
<li ><a href ="NSObject.html#method-21">-awakeAfterUsingCoder:</a>
<li ><a href ="NSObject.html#method-22">-classForArchiver</a>
<li ><a href ="NSObject.html#method-23">-classForCoder</a>
<li ><a href ="NSObject.html#method-24">-classForPortCoder</a>
<li ><a href ="NSObject.html#method-25">-connection:handleRequest:</a>
<li ><a href ="NSObject.html#method-26">-copy</a>
<li ><a href ="NSObject.html#method-27">-dealloc</a>
<li ><a href ="NSObject.html#method-45">-deallocNotificationsActive</a>
<li ><a href ="NSObject.html#method-28">-description</a>
<li ><a href ="NSObject.html#method-29">-descriptionWithLocale:</a>
<li ><a href ="NSObject.html#method-30">-descriptionWithLocale:indent:</a>
<li ><a href ="NSObject.html#method-31">-descriptionWithLocale:indent:to:</a>
<li ><a href ="NSObject.html#method-32">-doesNotRecognizeSelector:</a>
<li ><a href ="NSObject.html#method-33">-forwardInvocation:</a>
<li ><a href ="NSObject.html#method-34">-hash</a>
<li ><a href ="NSObject.html#method-35">-init</a>
<li ><a href ="NSObject.html#method-36">-isEqual:</a>
<li ><a href ="NSObject.html#method-37">-methodForSelector:</a>
<li ><a href ="NSObject.html#method-38">-methodSignatureForSelector:</a>
<li ><a href ="NSObject.html#method-39">-mutableCopy</a>
<li ><a href ="NSObject.html#method-40">-performSelector:withObject:</a>
<li ><a href ="NSObject.html#method-41">-performSelector:withObject:afterDelay:inModes:</a>
<li ><a href ="NSObject.html#method-42">-replacementObjectForArchiver:</a>
<li ><a href ="NSObject.html#method-43">-replacementObjectForCoder:</a>
<li ><a href ="NSObject.html#method-44">-replacementObjectForPortCoder:</a>
<li ><a href ="NSObject.html#method-46">-setDeallocNotificationsActive:</a>
</ul>
<hr><h2>Class Methods </h2>
<h3><a name ="method-0">alloc</a></h3>
+ (id) <b>alloc</b>;<br>
Allocates a new instance of the receiver from the default
zone, by invoking <code>allocWithZone:</code> with
<code>NSDefaultMallocZone()</code> as the zone argument.
Returns the created instance.
<hr>
<h3><a name ="method-1">allocWithZone:</a></h3>
+ (id) <b>allocWithZone:</b> (NSZone*)zone;<br>
This is the basic method to create a new instance. It
allocates a new instance of the receiver from the specified
memory zone.
<p>
Memory for an instance of the receiver is allocated; a
pointer to this newly created instance is returned. All
instance variables are set to 0 except the
<code>isa</code> pointer which is set to point to the
object class. No initialization of the instance is
performed: it is your responsibility to initialize the
instance by calling an appropriate <code>init</code>
method. If you are not using the garbage collector, it is
also your responsibility to make sure the returned
instance is destroyed when you finish using it, by calling
the <code>release</code> method to destroy the instance
directly, or by using <code>autorelease</code> and
autorelease pools.
</p>
<p>
You do not normally need to override this method in
subclasses, unless you are implementing a class which for
some reasons silently allocates instances of another class
(this is typically needed to implement class clusters and
similar design schemes).
</p>
<p>
If you have turned on debugging of object allocation (by
calling the <code>GSDebugAllocationActive</code>
function), this method will also update the various
debugging counts and monitors of allocated objects, which
you can access using the <code>GSDebugAllocation...</code>
functions.
</p>
<hr>
<h3><a name ="method-2">cancelPreviousPerformRequestsWithTarget:selector:</a></h3>
+ (void) <b>cancelPreviousPerformRequestsWithTarget:</b> (id)aTarget <b>selector:</b> (SEL)aSelector;<br>
<hr>
<h3><a name ="method-3">class</a></h3>
+ (Class) <b>class</b>;<br>
Returns the receiver.
<hr>
<h3><a name ="method-4">conformsToProtocol:</a></h3>
+ (BOOL) <b>conformsToProtocol:</b> (Protocol*)aProtocol;<br>
<hr>
<h3><a name ="method-5">copyWithZone:</a></h3>
+ (id) <b>copyWithZone:</b> (NSZone*)zone;<br>
<hr>
<h3><a name ="method-6">description</a></h3>
+ (NSString*) <b>description</b>;<br>
The <code>description</code> factory method describes the class
of the receiver. In the default GNUstep implementation, this
simply returns the name of the class as an NSString object.
<hr>
<h3><a name ="method-7">descriptionWithLocale:</a></h3>
+ (NSString*) <b>descriptionWithLocale:</b> (NSDictionary*)aLocale;<br>
Standards: GNUstep<br>
The default (NSOBject) implementation of this method simply calls
the <code>description</code> method and discards the locale
information.
<hr>
<h3><a name ="method-8">descriptionWithLocale:indent:</a></h3>
+ (NSString*) <b>descriptionWithLocale:</b> (NSDictionary*)aLocale <b>indent:</b> (unsigned int)level;<br>
Standards: GNUstep<br>
The default (NSObject) implementation of this method simply calls
the <code>descriptionWithLocale:</code> method and discards the
level information.
<hr>
<h3><a name ="method-9">descriptionWithLocale:indent:to:</a></h3>
+ (NSString*) <b>descriptionWithLocale:</b> (NSDictionary*)aLocale <b>indent:</b> (unsigned int)level <b>to:</b> (id&#60;GNUDescriptionDestination>)output;<br>
Standards: GNUstep<br>
The default (NSObject) implementation of this method simply calls
the <code>descriptionWithLocale:indent:</code> method and appends
the value returned by that method to the output object.
<hr>
<h3><a name ="method-10">initialize</a></h3>
+ (void) <b>initialize</b>;<br>
<hr>
<h3><a name ="method-11">instanceMethodForSelector:</a></h3>
+ (IMP) <b>instanceMethodForSelector:</b> (SEL)aSelector;<br>
<hr>
<h3><a name ="method-12">instanceMethodSignatureForSelector:</a></h3>
+ (NSMethodSignature*) <b>instanceMethodSignatureForSelector:</b> (SEL)aSelector;<br>
Returns a method signature object representing the
method implemented for instsances of this class which
corresponds to the supplied selector.
<hr>
<h3><a name ="method-13">instancesRespondToSelector:</a></h3>
+ (BOOL) <b>instancesRespondToSelector:</b> (SEL)aSelector;<br>
<hr>
<h3><a name ="method-14">load</a></h3>
+ (void) <b>load</b>;<br>
<hr>
<h3><a name ="method-15">mutableCopyWithZone:</a></h3>
+ (id) <b>mutableCopyWithZone:</b> (NSZone*)zone;<br>
<hr>
<h3><a name ="method-16">new</a></h3>
+ (id) <b>new</b>;<br>
This method is a short-hand for alloc followed by init, that is,
<p>
<code>
NSObject *object = [NSObject new];
</code></p>
is exactly the same as
<p>
<code>
NSObject *object = [[NSObject alloc] init];
</code></p>
<p>
This is a general convention: all <code>new...</code>
methods are supposed to return a newly allocated and
initialized instance, as would be generated by an
<code>alloc</code> method followed by a corresponding
<code>init...</code> method. Please note that if you are
not using a garbage collector, this means that instances
generated by the <code>new...</code> methods are not
autoreleased, that is, you are responsible for releasing
(autoreleasing) the instances yourself. So when you use
<code>new</code> you typically do something like:
</p>
<p>
<code>
NSMutableArray *array = AUTORELEASE ([NSMutableArray new]);
</code>
</p>
<p>
You do no normally need to override <code>new</code> in
subclasses, because if you override <code>init</code> (and
optionally <code>allocWithZone:</code> if you really
need), <code>new</code> will automatically use your
subclass methods.
</p>
<p>
You might need instead to define new <code>new...</code>
methods specific to your subclass to match any
<code>init...</code> specific to your subclass. For
example, if your subclass defines
</p>
<p>
<code>-initWithName:</code>
</p>
<p>
it might be handy for you to have a
</p>
<p>
<code>+newWithName:</code>
</p>
<p>
which combines <code>alloc</code> and
<code>initWithName:</code>. You would implement it as follows:
</p>
<p>
<code>
+ (id) newWithName: (NSString *)aName
{
return [[self alloc] initWithName: aName];
}
</code>
</p>
<hr>
<h3><a name ="method-17">poseAsClass:</a></h3>
+ (void) <b>poseAsClass:</b> (Class)aClass;<br>
<hr>
<h3><a name ="method-18">setVersion:</a></h3>
+ (void) <b>setVersion:</b> (int)aVersion;<br>
<hr>
<h3><a name ="method-19">superclass</a></h3>
+ (Class) <b>superclass</b>;<br>
<hr>
<h3><a name ="method-20">version</a></h3>
+ (int) <b>version</b>;<br>
<hr>
<hr><h2>Instances Methods </h2>
<h3><a name ="method-21">awakeAfterUsingCoder:</a></h3>
- (id) <b>awakeAfterUsingCoder:</b> (NSCoder*)aDecoder;<br>
<hr>
<h3><a name ="method-22">classForArchiver</a></h3>
- (Class) <b>classForArchiver</b>;<br>
<hr>
<h3><a name ="method-23">classForCoder</a></h3>
- (Class) <b>classForCoder</b>;<br>
<hr>
<h3><a name ="method-24">classForPortCoder</a></h3>
- (Class) <b>classForPortCoder</b>;<br>
<hr>
<h3><a name ="method-25">connection:handleRequest:</a></h3>
- (BOOL) <b>connection:</b> (NSConnection*)connection <b>handleRequest:</b> (NSDistantObjectRequest*)doreq;<br>
<hr>
<h3><a name ="method-26">copy</a></h3>
- (id) <b>copy</b>;<br>
<hr>
<h3><a name ="method-27">dealloc</a></h3>
- (void) <b>dealloc</b>;<br>
<p>
<code>NSObject</code>'s implementation of this method
destroys the receiver, by returning the memory allocated
to the receiver to the system. After this method has been
called on an instance, you must not refer the instance in
any way, because it does not exist any longer. If you do,
it is a bug and your program might even crash with a
segmentation fault.
</p>
<p>
If you have turned on the debugging facilities for
instance allocation, <code>NSObject</code>'s
implementation of this method will also update the various
counts and monitors of allocated instances (see the
<code>GSDebugAllocation...</code> functions for more
info).
</p>
<p>
Normally you are supposed to manage the memory taken by
objects by using the high level interface provided by the
<code>retain</code>, <code>release</code> and
<code>autorelease</code> methods (or better by the
corresponding macros <code>RETAIN</code>,
<code>RELEASE</code> and <code>AUTORELEASE</code>), and by
autorelease pools and such; whenever the
release/autorelease mechanism determines that an object is
no longer needed (which happens when its retain count
reaches 0), it will call the <code>dealloc</code> method
to actually deallocate the object. This means that normally,
you should not need to call <code>dealloc</code> directly as
the gnustep base library automatically calls it for you when
the retain count of an object reaches 0.
</p>
<p>
Because the <code>dealloc</code> method will be called
when an instance is being destroyed, if instances of your
subclass use objects or resources (as it happens for most
useful classes), you must override <code>dealloc</code> in
subclasses to release all objects and resources which are
used by the instance, otherwise these objects and
resources would be leaked. In the subclass
implementation, you should first release all your subclass
specific objects and resources, and then invoke super's
implementation (which will do the same, and so on up in
the class hierarchy to <code>NSObject</code>'s
implementation, which finally destroys the object). Here
is an example of the implementation of
<code>dealloc</code> for a subclass whose instances have a
single instance variable <code>name</code> which needs to
be released when an instance is deallocated:
</p>
<p>
<code>
- (void) dealloc
{
RELEASE (name);
[super dealloc];
}
</code>
</p>
<p>
<code>dealloc</code> might contain code to release not
only objects, but also other resources, such as open
files, network connections, raw memory allocated in other
ways, etc.
</p>
<hr>
<h3><a name ="method-28">description</a></h3>
- (NSString*) <b>description</b>;<br>
<p>
The <code>description</code> method describes the reciever.
In the default GNUstep implementation, this returns an NSString
object giving the name of the class of the receiver and the
hexadecimal representation of the recievers address enclosed
in angle brackets.
</p>
<p>
Generally, classes other than NSObject will override this method
to provide a more informative description of their instances.
</p>
<hr>
<h3><a name ="method-29">descriptionWithLocale:</a></h3>
- (NSString*) <b>descriptionWithLocale:</b> (NSDictionary*)aLocale;<br>
Standards: GNUstep<br>
The default (NSOBject) implementation of this method simply calls
the <code>description</code> method and discards the locale
information.
<hr>
<h3><a name ="method-30">descriptionWithLocale:indent:</a></h3>
- (NSString*) <b>descriptionWithLocale:</b> (NSDictionary*)aLocale <b>indent:</b> (unsigned int)level;<br>
Standards: GNUstep<br>
The default (NSObject) implementation of this method simply calls
the <code>descriptionWithLocale:</code> method and discards the
level information.
<hr>
<h3><a name ="method-31">descriptionWithLocale:indent:to:</a></h3>
- (NSString*) <b>descriptionWithLocale:</b> (NSDictionary*)aLocale <b>indent:</b> (unsigned int)level <b>to:</b> (id&#60;GNUDescriptionDestination>)output;<br>
Standards: GNUstep<br>
The default (NSObject) implementation of this method simply calls
the <code>descriptionWithLocale:indent:</code> method and appends
the value returned by that method to the output object.
<p>
Property-list classes (NSString, NSArray, NSDictionary and
NSData) will override this method in order to efficiently
write descriptions of themselves into property lists.
</p>
<hr>
<h3><a name ="method-32">doesNotRecognizeSelector:</a></h3>
- (void) <b>doesNotRecognizeSelector:</b> (SEL)aSelector;<br>
<hr>
<h3><a name ="method-33">forwardInvocation:</a></h3>
- (void) <b>forwardInvocation:</b> (NSInvocation*)anInvocation;<br>
<hr>
<h3><a name ="method-34">hash</a></h3>
- (unsigned int) <b>hash</b>;<br>
<hr>
<h3><a name ="method-35">init</a></h3>
- (id) <b>init</b>;<br>
<hr>
<h3><a name ="method-36">isEqual:</a></h3>
- (BOOL) <b>isEqual:</b> (id)anObject;<br>
<hr>
<h3><a name ="method-37">methodForSelector:</a></h3>
- (IMP) <b>methodForSelector:</b> (SEL)aSelector;<br>
<hr>
<h3><a name ="method-38">methodSignatureForSelector:</a></h3>
- (NSMethodSignature*) <b>methodSignatureForSelector:</b> (SEL)aSelector;<br>
Returns a method signature object representing the
method implemented in this object which corresponds to
the supplied selector.
<hr>
<h3><a name ="method-39">mutableCopy</a></h3>
- (id) <b>mutableCopy</b>;<br>
<hr>
<h3><a name ="method-40">performSelector:withObject:</a></h3>
- (void) <b>performSelector:</b> (SEL)aSelector <b>withObject:</b> (id)anArgument;<br>
<hr>
<h3><a name ="method-41">performSelector:withObject:afterDelay:inModes:</a></h3>
- (void) <b>performSelector:</b> (SEL)aSelector <b>withObject:</b> (id)anArgument <b>afterDelay:</b> (NSTimeInterval)delay <b>inModes:</b> (NSArray*)modes;<br>
<hr>
<h3><a name ="method-42">replacementObjectForArchiver:</a></h3>
- (id) <b>replacementObjectForArchiver:</b> (NSArchiver*)anArchiver;<br>
<hr>
<h3><a name ="method-43">replacementObjectForCoder:</a></h3>
- (id) <b>replacementObjectForCoder:</b> (NSCoder*)aCoder;<br>
<hr>
<h3><a name ="method-44">replacementObjectForPortCoder:</a></h3>
- (id) <b>replacementObjectForPortCoder:</b> (NSPortCoder*)aCoder;<br>
<hr>
<h3><a name ="method-45">deallocNotificationsActive</a></h3>
- (BOOL) <b>deallocNotificationsActive</b>;<br>
<p>
Returns a boolean indicating whether deallocation notification
has been turned on.
</p>
<p>
If deallocation notification is turned on, whenever an objects
retain count reaches zero (and it would normally be deallocated)
the <em>_dealloc</em> methiod is called and the object is only
deallocated if that method returns YES.
</p>
<hr>
<h3><a name ="method-46">setDeallocNotificationsActive:</a></h3>
- (void) <b>setDeallocNotificationsActive:</b> (BOOL)flag;<br>
<p>
Turns on (or off) deallocation notification.
</p>
<p>
If deallocation notification is turned on, whenever an objects
retain count reaches zero (and it would normally be deallocated)
the <em>_dealloc</em> methiod is called and the object is only
deallocated if that method returns YES.
</p>
<hr>
<h3><a name ="method-47">_dealloc</a></h3>
- (BOOL) <b>_dealloc</b>;<br>
<p>
Returns a boolean indicating whether the receiver should be
deallocated or not. The default implementation returns YES.
</p>
<p>
This method is called when an objects retain count reaches
zero (if deallocation notifications are active).
</p>
<p>
This method is provided so that you can take some sort of
action when objects are deallocated ... normally you would
override this method in your classes, but you could also
override it in a category of NSObject - and perform some
action whenever <em>any</em> object is deallocated.
</p>
<hr>
</body>
</html>