所有子类共享的Objective-C类方法中的Aren静态变量是什么?

时间:2014-04-15 14:52:56

标签: objective-c grand-central-dispatch static-variables class-method

我真的很困惑。我有一个类A,它带有一个返回共享缓存实例的类方法:

+ (NSCache *)itemCache {
    static NSCache *itemCache;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        itemCache = [[NSCache alloc] init];
    });
    return itemCache;
}

我还有一个A类的子类。

每当我调用[A itemCache]时,我都会得到一个缓存实例。每当我打电话给[B itemCache]时,我都会得到一个不同的缓存实例。

静态变量对于调用该方法的特定类是否唯一?我认为它们在所有子类中共享。

编辑没关系,还有其他事情要发生。世界确实像我想象的那样工作。我有一个应用目标和一个测试目标。 A类被包括在两个目标中。 B类仅在应用目标中。

1 个答案:

答案 0 :(得分:1)

此代码产生预期的行为:

#import <Foundation/Foundation.h>

@interface A : NSObject
+ (NSCache *)itemCache;
@end

@implementation A
+ (NSCache *)itemCache {
    static NSCache *itemCache;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        itemCache = [[NSCache alloc] init];
    });
    return itemCache;
}

@end

@interface B : A
@end
@implementation B
@end


@interface C : A
@end
@implementation C
@end



int main(int argc, const char * argv[])
{

    @autoreleasepool {
            NSLog(@"%@ %@ %@", [A itemCache], [B itemCache], [C itemCache]);

    }
    return 0;
}

日志:

<NSCache: 0x1002000e0> <NSCache: 0x1002000e0> <NSCache: 0x1002000e0>

你的问题必须是别的 - 在哪里。