mirror of
https://github.com/gnustep/libs-base.git
synced 2025-05-11 08:40:44 +00:00
Documentation improvements.
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@16922 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
83add29ddf
commit
8e8a68a78f
3 changed files with 118 additions and 18 deletions
|
@ -1,3 +1,9 @@
|
||||||
|
2003-06-15 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
|
* Source/NSAutoreleasePool.m: Documented.
|
||||||
|
* Headers/gnustep/base/NSObject.h: Documented memory management macros
|
||||||
|
for autogsdoc.
|
||||||
|
|
||||||
2003-06-14 Richard Frith-Macdonald <rfm@gnu.org>
|
2003-06-14 Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
|
|
||||||
* Source/Additions/GSMime.m: Better attempt to infer charset from
|
* Source/Additions/GSMime.m: Better attempt to infer charset from
|
||||||
|
|
|
@ -374,41 +374,57 @@ GS_EXPORT NSRecursiveLock *gnustep_global_lock;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/*
|
|
||||||
* Basic retain, release, and autorelease operations.
|
|
||||||
*/
|
|
||||||
#ifndef RETAIN
|
#ifndef RETAIN
|
||||||
|
/**
|
||||||
|
* Basic retain operation ... calls [NSObject-retain]
|
||||||
|
*/
|
||||||
#define RETAIN(object) [object retain]
|
#define RETAIN(object) [object retain]
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef RELEASE
|
#ifndef RELEASE
|
||||||
|
/**
|
||||||
|
* Basic release operation ... calls [NSObject-release]
|
||||||
|
*/
|
||||||
#define RELEASE(object) [object release]
|
#define RELEASE(object) [object release]
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef AUTORELEASE
|
#ifndef AUTORELEASE
|
||||||
|
/**
|
||||||
|
* Basic autorelease operation ... calls [NSObject-autorelease]
|
||||||
|
*/
|
||||||
#define AUTORELEASE(object) [object autorelease]
|
#define AUTORELEASE(object) [object autorelease]
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
#ifndef TEST_RETAIN
|
||||||
* Tested retain, release, and autorelease operations - only invoke the
|
/**
|
||||||
|
* Tested retain - only invoke the
|
||||||
* objective-c method if the receiver is not nil.
|
* objective-c method if the receiver is not nil.
|
||||||
*/
|
*/
|
||||||
#ifndef TEST_RETAIN
|
|
||||||
#define TEST_RETAIN(object) ({\
|
#define TEST_RETAIN(object) ({\
|
||||||
id __object = (id)(object); (__object != nil) ? [__object retain] : nil; })
|
id __object = (id)(object); (__object != nil) ? [__object retain] : nil; })
|
||||||
#endif
|
#endif
|
||||||
#ifndef TEST_RELEASE
|
#ifndef TEST_RELEASE
|
||||||
|
/**
|
||||||
|
* Tested release - only invoke the
|
||||||
|
* objective-c method if the receiver is not nil.
|
||||||
|
*/
|
||||||
#define TEST_RELEASE(object) ({\
|
#define TEST_RELEASE(object) ({\
|
||||||
id __object = (id)(object); if (__object != nil) [__object release]; })
|
id __object = (id)(object); if (__object != nil) [__object release]; })
|
||||||
#endif
|
#endif
|
||||||
#ifndef TEST_AUTORELEASE
|
#ifndef TEST_AUTORELEASE
|
||||||
|
/**
|
||||||
|
* Tested autorelease - only invoke the
|
||||||
|
* objective-c method if the receiver is not nil.
|
||||||
|
*/
|
||||||
#define TEST_AUTORELEASE(object) ({\
|
#define TEST_AUTORELEASE(object) ({\
|
||||||
id __object = (id)(object); (__object != nil) ? [__object autorelease] : nil; })
|
id __object = (id)(object); (__object != nil) ? [__object autorelease] : nil; })
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
#ifndef ASSIGN
|
||||||
|
/**
|
||||||
* ASSIGN(object,value) assigns the value to the object with
|
* ASSIGN(object,value) assigns the value to the object with
|
||||||
* appropriate retain and release operations.
|
* appropriate retain and release operations.
|
||||||
*/
|
*/
|
||||||
#ifndef ASSIGN
|
|
||||||
#define ASSIGN(object,value) ({\
|
#define ASSIGN(object,value) ({\
|
||||||
id __value = (id)(value); \
|
id __value = (id)(value); \
|
||||||
id __object = (id)(object); \
|
id __object = (id)(object); \
|
||||||
|
@ -427,11 +443,11 @@ if (__value != __object) \
|
||||||
})
|
})
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
#ifndef ASSIGNCOPY
|
||||||
|
/**
|
||||||
* ASSIGNCOPY(object,value) assigns a copy of the value to the object
|
* ASSIGNCOPY(object,value) assigns a copy of the value to the object
|
||||||
* with release of the original.
|
* with release of the original.
|
||||||
*/
|
*/
|
||||||
#ifndef ASSIGNCOPY
|
|
||||||
#define ASSIGNCOPY(object,value) ({\
|
#define ASSIGNCOPY(object,value) ({\
|
||||||
id __value = (id)(value); \
|
id __value = (id)(value); \
|
||||||
id __object = (id)(object); \
|
id __object = (id)(object); \
|
||||||
|
@ -450,14 +466,14 @@ if (__value != __object) \
|
||||||
})
|
})
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
#ifndef DESTROY
|
||||||
|
/**
|
||||||
* DESTROY() is a release operation which also sets the variable to be
|
* DESTROY() is a release operation which also sets the variable to be
|
||||||
* a nil pointer for tidyness - we can't accidentally use a DESTROYED
|
* a nil pointer for tidyness - we can't accidentally use a DESTROYED
|
||||||
* object later. It also makes sure to set the variable to nil before
|
* object later. It also makes sure to set the variable to nil before
|
||||||
* releasing the object - to avoid side-effects of the release trying
|
* releasing the object - to avoid side-effects of the release trying
|
||||||
* to reference the object being released through the variable.
|
* to reference the object being released through the variable.
|
||||||
*/
|
*/
|
||||||
#ifndef DESTROY
|
|
||||||
#define DESTROY(object) ({ \
|
#define DESTROY(object) ({ \
|
||||||
if (object) \
|
if (object) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -469,16 +485,19 @@ if (__value != __object) \
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef CREATE_AUTORELEASE_POOL
|
#ifndef CREATE_AUTORELEASE_POOL
|
||||||
|
/**
|
||||||
|
* Declares an autorelease pool variable and creates and initialises
|
||||||
|
* an autorelease pool object.
|
||||||
|
*/
|
||||||
#define CREATE_AUTORELEASE_POOL(X) \
|
#define CREATE_AUTORELEASE_POOL(X) \
|
||||||
NSAutoreleasePool *(X) = [NSAutoreleasePool new]
|
NSAutoreleasePool *(X) = [NSAutoreleasePool new]
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
#ifndef RECREATE_AUTORELEASE_POOL
|
||||||
|
/**
|
||||||
* Similar, but allows reuse of variables. Be sure to use DESTROY()
|
* Similar, but allows reuse of variables. Be sure to use DESTROY()
|
||||||
* so the object variable stays nil.
|
* so the object variable stays nil.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef RECREATE_AUTORELEASE_POOL
|
|
||||||
#define RECREATE_AUTORELEASE_POOL(X) \
|
#define RECREATE_AUTORELEASE_POOL(X) \
|
||||||
if (X == nil) \
|
if (X == nil) \
|
||||||
(X) = [NSAutoreleasePool new]
|
(X) = [NSAutoreleasePool new]
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||||
|
|
||||||
Written by: Andrew Kachites McCallum <mccallum@gnu.ai.mit.edu>
|
Written by: Andrew Kachites McCallum <mccallum@gnu.ai.mit.edu>
|
||||||
|
Written by: Richard Frith-Macdonald <rfm@gnu.org>
|
||||||
Date: January 1995
|
Date: January 1995
|
||||||
|
|
||||||
This file is part of the GNUstep Base Library.
|
This file is part of the GNUstep Base Library.
|
||||||
|
@ -121,8 +122,28 @@ pop_pool_from_cache (struct autorelease_thread_vars *tv)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* This class maintains a stack of autorelease pools objects
|
* The standard OpenStep system of memory management employs retain counts.
|
||||||
* in each thread.
|
* When an object is created, it has a retain count of 1. When an object
|
||||||
|
* is retained, the retain count is incremented. When it is released the
|
||||||
|
* retain count is decremented, and when the retain count goes to zero the
|
||||||
|
* object gets deallocated.
|
||||||
|
* </p>
|
||||||
|
* <p>
|
||||||
|
* A simple retain/release mechanism is not very interesting ...
|
||||||
|
* so it's spiced up with autorelease pools. You can use the
|
||||||
|
* AUTORELEASE() macro to call the [NSObject-autorelease]
|
||||||
|
* method, which adds an object to the current autorelease pool by
|
||||||
|
* calling [NSAutoreleasePool+addObject:].<br />
|
||||||
|
* An autorelease pool simply maintains a reference to each object
|
||||||
|
* added to it, and for each addition, the autorelease pool will
|
||||||
|
* call the [NSObject-release] method of the object when the pool
|
||||||
|
* is released. So doing an AUTORELEASE() is just the same as
|
||||||
|
* doing a RELEASE(), but deferred until the current autorelease
|
||||||
|
* pool is deallocated.
|
||||||
|
* </p>
|
||||||
|
* <p>
|
||||||
|
* The NSAutoreleasePool class maintains a separate stack of
|
||||||
|
* autorelease pools objects in each thread.
|
||||||
* </p>
|
* </p>
|
||||||
* <p>
|
* <p>
|
||||||
* When an autorelease pool is created, it is automatically
|
* When an autorelease pool is created, it is automatically
|
||||||
|
@ -132,6 +153,50 @@ pop_pool_from_cache (struct autorelease_thread_vars *tv)
|
||||||
* When a pool is destroyed, it (and any pool later in
|
* When a pool is destroyed, it (and any pool later in
|
||||||
* the stack) is removed from the stack.
|
* the stack) is removed from the stack.
|
||||||
* </p>
|
* </p>
|
||||||
|
* <p>
|
||||||
|
* This mechanism provides a simple but controllable and reasonably
|
||||||
|
* efficient way of managing temporary objects. An object can be
|
||||||
|
* autoreleased and then passed around and used until the topmost
|
||||||
|
* pool in the stack is destroyed.
|
||||||
|
* </p>
|
||||||
|
* <p>
|
||||||
|
* Most methods return objects which are either owned by autorelease
|
||||||
|
* pools or by the receiver of the method, so the lifetime of the
|
||||||
|
* returned object can be assumed to be the shorter of the lifetime
|
||||||
|
* of the current autorelease pool, or that of the receiver on which
|
||||||
|
* the method was called.<br />
|
||||||
|
* The exceptions to this are those object returned by -
|
||||||
|
* </p>
|
||||||
|
* <deflist>
|
||||||
|
* <term>[NSObject+alloc], [NSObject+allocWithZone:]</term>
|
||||||
|
* <desc>
|
||||||
|
* Methods whose names begin with alloc return an uninitialised
|
||||||
|
* object, owned by the caller.
|
||||||
|
* </desc>
|
||||||
|
* <term>[NSObject-init]</term>
|
||||||
|
* <desc>
|
||||||
|
* Methods whose names begin with init return an initialised
|
||||||
|
* version of the receiving object, owned by the caller.<br />
|
||||||
|
* NB. The returned object may not actualy be the same as the
|
||||||
|
* receiver ... sometimes an init method releases the original
|
||||||
|
* receiver and returns an alternative.
|
||||||
|
* </desc>
|
||||||
|
* <term>[NSObject+new]</term>
|
||||||
|
* <desc>
|
||||||
|
* Methods whose names begin with new combine the effects of
|
||||||
|
* allocation and initialisation.
|
||||||
|
* </desc>
|
||||||
|
* <term>[NSObject-copy], [(NSCopying)-copyWithZone:]</term>
|
||||||
|
* <desc>
|
||||||
|
* Methods whose names begin with copy create a copy of the receiver
|
||||||
|
* which is owned by the caller.
|
||||||
|
* </desc>
|
||||||
|
* <term>[NSObject-mutableCopy], [(NSMutableCopying)-mutableCopyWithZone:]</term>
|
||||||
|
* <desc>
|
||||||
|
* Methods whose names begin with mutableCopy create a copy of the receiver
|
||||||
|
* which is owned by the caller.
|
||||||
|
* </desc>
|
||||||
|
* </deflist>
|
||||||
*/
|
*/
|
||||||
@implementation NSAutoreleasePool
|
@implementation NSAutoreleasePool
|
||||||
|
|
||||||
|
@ -293,7 +358,7 @@ static IMP initImp;
|
||||||
/**
|
/**
|
||||||
* Adds the specified object to the current autorelease pool.
|
* Adds the specified object to the current autorelease pool.
|
||||||
* If there is no autorelease pool in the thread,
|
* If there is no autorelease pool in the thread,
|
||||||
* a warning is logged.
|
* a warning is logged and the object is leaked (ie it will not be released).
|
||||||
*/
|
*/
|
||||||
+ (void) addObject: (id)anObj
|
+ (void) addObject: (id)anObj
|
||||||
{
|
{
|
||||||
|
@ -494,11 +559,20 @@ static IMP initImp;
|
||||||
free_pool_cache(tv);
|
free_pool_cache(tv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets (to zero) the count of autoreleased objects in the current thread.
|
||||||
|
*/
|
||||||
+ (void) resetTotalAutoreleasedObjects
|
+ (void) resetTotalAutoreleasedObjects
|
||||||
{
|
{
|
||||||
ARP_THREAD_VARS->total_objects_count = 0;
|
ARP_THREAD_VARS->total_objects_count = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the number of objects which have been autoreleased in the
|
||||||
|
* current thread since the last call to +resetTotalAutoreleasedObjects.<br />
|
||||||
|
* NB. This is not normally supported ... enable it as a compile time option
|
||||||
|
* by editing NSAutoreleasePool.m when building the base library.
|
||||||
|
*/
|
||||||
+ (unsigned) totalAutoreleasedObjects
|
+ (unsigned) totalAutoreleasedObjects
|
||||||
{
|
{
|
||||||
return ARP_THREAD_VARS->total_objects_count;
|
return ARP_THREAD_VARS->total_objects_count;
|
||||||
|
@ -554,3 +628,4 @@ static IMP initImp;
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue