Singletons on Leopard with GC

  • I have a couple of classes for which I'd like to use the singleton
    pattern.

    I read some of the old posts on this list and at cocoadev.com about
    approaches to take. They mention Apple's recommendations about
    overriding retain, release, etc. to essentially turn them into no-ops.
    However, they're from pre-Leopard days, and in a GC-required app, the
    compiler automatically no-ops those methods.

    I'm currently using something like this code in my implementations:

    static MyClass *sharedInstance;
    + (MyClass *)sharedInstance {
    if (!sharedInstance)
      sharedInstance = [[self alloc] init];
    return sharedInstance;
    }

    - (id)init {
    if (!sharedInstance)
      sharedInstance = [super init];
    return sharedInstance;
    }

    My goal is to ensure that [MyClass sharedInstance] and [[MyClass
    alloc] init] return the same singleton object. Furthermore, I'd like
    to ensure that an object instantiated in a NIB is the sharedInstance
    too. So far, it seems to work, but I'm afraid I've missed something.

    Any suggestions? Thanks.

    ----
    Karl Moskowski <kolpanic...>
    Voodoo Ergonomics Inc. <http://voodooergonomics.com/>
  • Apple has added a comment about garbage-collected singletons in its
    Cocoa Fundamentals Guide:
    http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals
    /CocoaObjects/chapter_3_section_10.html


    Basically you create a singleton as shown in the guide's example, but
    in a garbage-collected environment you can leave out implementing the
    release, retain, retainCount, and autorelease methods.

    If you follow the Apple example you will need to implement a class
    factory method, allocWithZone: and copyWithZone.

    - Dave

    On 10 Apr 2008, at 22:11, Karl Moskowski wrote:

    > I have a couple of classes for which I'd like to use the singleton
    > pattern.
    >
    > I read some of the old posts on this list and at cocoadev.com about
    > approaches to take. They mention Apple's recommendations about
    > overriding retain, release, etc. to essentially turn them into no-
    > ops. However, they're from pre-Leopard days, and in a GC-required
    > app, the compiler automatically no-ops those methods.
    >
    > I'm currently using something like this code in my implementations:
    >
    > static MyClass *sharedInstance;
    > + (MyClass *)sharedInstance {
    > if (!sharedInstance)
    > sharedInstance = [[self alloc] init];
    > return sharedInstance;
    > }
    >
    > - (id)init {
    > if (!sharedInstance)
    > sharedInstance = [super init];
    > return sharedInstance;
    > }
    >
    > My goal is to ensure that [MyClass sharedInstance] and [[MyClass
    > alloc] init] return the same singleton object. Furthermore, I'd like
    > to ensure that an object instantiated in a NIB is the sharedInstance
    > too. So far, it seems to work, but I'm afraid I've missed something.
    >
    > Any suggestions? Thanks.
    >
    > ----
    > Karl Moskowski <kolpanic...>
    > Voodoo Ergonomics Inc. <http://voodooergonomics.com/
previous month april 2008 next month
MTWTFSS
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
Go to today
MindNode
MindNode offered a free license !