子类NSCache - App Singleton

时间:2010-08-17 23:55:04

标签: iphone objective-c caching singleton ios4

我正在编写一个iPhone应用程序,我想创建一个NSCache单例。

我遇到了麻烦,这是我的代码:

MyAppCache.h:

#import <Foundation/Foundation.h>

@interface MyAppCache : NSCache {}

+ (MyAppCache *) sharedCache;

@end

MyAppCache.m:

#import "SpotmoCache.h"

static MyAppCache *sharedMyAppCache = nil;

@implementation MyAppCache

+ (MyAppCache *) sharedCache {
    if (sharedMyAppCache == nil) {
        sharedMyAppCache = [[super allocWithZone:NULL] init];
    }
    return sharedMyAppCache; 
}

+ (id)allocWithZone:(NSZone *)zone {
    return [[self sharedCache] 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; 
}

@end

当我想添加内容或从缓存中获取内容时,我可能会写:

#import "MyAppCache.h"

MyAppCache *theCache = [MyAppCache sharedCache];  

然后:

NSData *someData = [[theCache objectForKey: keyString] retain];

或者:

[theCache setObject: someData forKey: keyString cost: sizeof(someData)];

问题:编译器抱怨'MyAppCache'可能无法响应每个行的'method'

我可能在这里做了一些完全错误的事情 - 知道如何使这项工作成功吗?

2 个答案:

答案 0 :(得分:1)

如果第一个列表是MyAppCache.h,那么你将@implementation放在头文件中,这不太可能做正确的事情(链接器可能会抱怨)。

如果第一个列表是MyAppCache.m,那么您需要将@interface移动到MyAppCache.h。

另请注意,您的代码会受到双重启动的影响:[[MyAppCache alloc] init]实际上是[[[MyAppCache sharedCache] retain] init]。我不知道NSCache在两次进行时的作用,但可能并不好。我真的不打算实现copyWithZone :(我很确定默认情况下对象不可复制),你可以覆盖allocWithZone:来引发异常。

(并且+ sharedCache不是线程安全的,这可能是也可能不是问题。)

答案 1 :(得分:-2)

好的,明白了。我有一个MyAppCache.h和MyAppCache.m文件的副本(以前的版本)仍然位于项目的文件夹中!