我正在编写一个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'。
我可能在这里做了一些完全错误的事情 - 知道如何使这项工作成功吗?
答案 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文件的副本(以前的版本)仍然位于项目的文件夹中!