2
static NSMutableDictionary * allTheSingletons;
@implementation BGSuperSingleton

+(instancetype)singleton
{
    return [self singleton1];
}
+(id) singleton1
{
    NSString* className = NSStringFromClass([self class]);

    if (!allTheSingletons)
    {
        allTheSingletons = NSMutableDictionary.dictionary;
    }

    id result = allTheSingletons[className];

    PO(result);
    if (result==nil)
    {
        result = [[[self class] alloc]init];
        allTheSingletons[className]=result;
    }
    return result;
}

BGSuperSingleton 应该是所有单例类的父类。

然后我在其中一个子类中做:

+(NSPredicate *)withinASquare:(double)distance{
    CLLocation * anchorWeUsed=[self singleton].mapCenterLocation; //Error map center is not of type ID
    return [self withinASquare:distance fromLocation:anchorWeUsed];
}

看起来 CLANG 不明白单例是类型+(instancetype),而是认为类型是 id。

我错过了什么?

替换selfMySubSingletonClass(这是在编译时已知的)虽然有效。

有什么解释吗?

4

1 回答 1

1

不确定(以下所有内容只是我的假设),但似乎在编译时编译器不知道[self singleton1]. 正如文档中所说(如果我们也推断该行为instancetype):

...如果该方法的返回类型与其类的类型兼容,则该方法将具有相关的结果类型...

singleton1返回未知类的对象,singleton并认为它返回与BGSuperSingleton类不兼容的对象(就编译时未知而言),因此相关的结果魔术在这里不起作用。

对此感兴趣并检查了:

+ (NSPredicate*) withinASquare: (double)distance {
    CLLocation* anchorWeUsed = [[self alloc] init].mapCenterLocation; // Error map center is not of type ID
    return [self withinASquare:distance fromLocation:anchorWeUsed];
}

allocinit返回相关的结果类,错误仍然存​​在。帮助的事情是:

+ (NSPredicate*) withinASquare: (double)distance {
    BGSuperSingleton* bgSuperSingleton = [[self alloc] init]; // class is known at compile time
    CLLocation* anchorWeUsed = bgSuperSingleton.mapCenterLocation; // no error here
    return [self withinASquare:distance fromLocation:anchorWeUsed];
}

我仍然对此感兴趣,并希望有人可以批准或纠正我的假设

于 2013-04-23T08:19:01.090 回答