0

在苹果文档单例中:

static MyGizmoClass *sharedGizmoManager = nil;

+ (MyGizmoClass*)sharedManager {
    if (sharedGizmoManager == nil) {
        sharedGizmoManager = [[super allocWithZone:NULL] init];
    }
    return sharedGizmoManager;
}

+ (id)allocWithZone:(NSZone *)zone {
    return [[self sharedManager] retain];
}

- (id)copyWithZone:(NSZone *)zone {
    return self;
}

- (id)retain {
    return self;
}

- (NSUInteger)retainCount {
    return NSUIntegerMax;  //denotes an object that cannot be released
}

- (void)release {
    //do nothing
}

- (id)autorelease {
    return self;
}

我有个问题:

+ (id)allocWithZone:(NSZone *)zone {
    return [[self sharedManager] retain];
}

保留应该省略,但为什么要保留保留?

因为 return [self sharedManager][[self sharedManager] retain]等于。

4

1 回答 1

1

归其sharedGizmoManager自己的类所有,但任何试图用于allocWithZone:创建实例的客户端代码都将期望拥有返回的引用(这是alloc/的规则allocWithZone:)。正是这样retain做的——将(部分)所有权赋予调用代码对现有实例的所有权。

客户端代码,因为它有一个拥有的引用,需要release在某个时候发送,当它使用对象完成时。如果没有“额外”保留,这实际上会释放对象对自身的所有权声明,并且对象可能(不正确地)被释放。

一句话,retain就是为了让单例(实际上是在管理自己的生命周期)与客户端代码将遵循的规则兼容。

于 2013-05-23T07:29:56.300 回答