最近我读别人的代码,看到他写的单例模式修改了retain, release:- (id)retain
{
    return self;
}- (unsigned)retainCount
{
    return UINT_MAX;  //denotes an object that cannot be released
}- (oneway void)release
{
    //do nothing
}- (id)autorelease
{
    return self;
}- (void)dealloc {
    [_sharedManager release];
    [super dealloc];
}
请问这样做是否必要呢?另外,如何让这个类只能调用shardInstance,而不让别人调用alloc init呢?

解决方案 »

  1.   


    +(AppropriateSingleton *) sharedAppropriateSingleton {
        @synchronized (self) {
            if (instance_ == nil) {
    //            instance_ = [[super allocWithZone:NULL] init]; // OR
                instance_ = [NSAllocateObject([self class], 0, NULL) init];
            }
        }
        
        return instance_;
    }+(id) allocWithZone:(NSZone *)zone {
        @synchronized (self) {
            return [[self sharedAppropriateSingleton] retain];
        }
    }-(id) copyWithZone:(NSZone *) zone {
        return self;
    }
    这样如何 ?
      

  2.   

    我主要想问,把retain, release, autorelease都覆盖是否必要呢?
      

  3.   

    我看一些第三方库的代码的单例,是楼上的两者结合起来的。
    别人调用这个类之前至少也应该知道这个类是干嘛的吧。所以让别人调用就是调用shareInstance的吧。至少我看到的都是这样。(正好想到obj-c如何使用单例,就找到这个旧帖了~结果公司的项目里面有,还用了一堆宏来写,刚开始也看到,结果不知道什么意思,现在终于知道了。附上一句“代码虐我千百遍,我待代码如初恋”)