On 28 Feb 2010, at 08:42, address@hidden wrote:
Although this works, it is a really, really bad way of creating a
singleton.
I copied it from the apple developer pages...
:-)
I thought +initialize would be called on program startup for every
class.
I guess you are confusing +initialize with +load
The +load method is called when your code is loaded into the program
(usually on program startup unless your code is in a dynamically
loaded bundle)
The +initialize method is called the first time anything tries to
*use* the class.
I want to be able to create my singleton on demand since it has
a rather large memory footprint. If that works with the method you
propose I'm fine with it.
+initialize is perfect for that.
Your +allocWithZone: method should really check that it's not a
subclass, before returning the singleton.
I don't want this class to be subclassed.
All the more reason why you should check.
eg.
+ (id) allocWithZone: (NSZone*)z
{
if (self != [MyClass class])
{
[]NSException raise: NSInvalidArgumentException
format: @"Illegal attempt to subclass MyClass as
%@", self];
}
if (sharedInstance == nil)
{
sharedInstance = [super allocWithZone: z];
}
}
In -initWithName:, you should check that self != nil after [super
init]. See the SUPERINIT macro from EtoileFoundation.
In a singleton, it's a good idea to override -dealloc to not call
[super dealloc]. This will cause a warning with GCC, which you can
hide like this:
- (void)dealloc
{
if (0)
{
[super dealloc];
}
}
How would you deallocate your singleton then?
Typically you don't deallocate singletons ... the idea is that they
are created on demand and then are available for the rest of the
program.
If you *want* to manually destroy the singleton before the program
ends, you can just add an extra class method to set sharedInstance to
nil and release the object, then -dealloc could do this:
- (void) dealloc
{
if (self != sharedInstance)
{
[super dealloc];
}
}
If you want multiple instances of the class, but never more than one
at a time, then you wouldn't create them in +initialize (and this
wouldn't really be what is meant by 'singleton'). In that case you
would use a lock to protect critical bits of code, have
+allocWithZone: return the existing instance (if there is one), and
have -dealloc reset the sharedInstance variable to nil.
_______________________________________________
Gnustep-dev mailing list
address@hidden
http://lists.gnu.org/mailman/listinfo/gnustep-dev