“[[self sharedManager]保留]”为什么要保留

时间:2013-05-23 07:11:17

标签: objective-c singleton-methods

在apple doc singleton:

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]相等。

1 个答案:

答案 0 :(得分:1)

sharedGizmoManager由其自己的类拥有,但尝试使用allocWithZone:创建实例的任何客户端代码都希望拥有返回的引用(这是alloc的规则/ allocWithZone:)。 retain完全相同 - 通过现有实例为调用代码提供(部分)所有权。

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

在一个句子中,retain可以使单身实际上管理自己的生命周期,与客户端代码将遵循的规则兼容。