2010-08-17 6 views
0

Я пишу приложение для iPhone, и я хочу создать синглтон NSCache.Подкласс NSCache - приложение Singleton

У меня возникли проблемы, вот код, который у меня есть:

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' может не реагировать на 'метод' для каждой из этих линий.

Возможно, я что-то совершенно не прав, знаю, как это сделать?

ответ

-2

ОК, получил его. У меня была копия (предыдущая версия) файлов MyAppCache.h и MyAppCache.m, которые все еще сидят в папке в проекте!

1

Если первый список - это MyAppCache.h, то вы вставляете @implementation в заголовочный файл, который вряд ли поступит правильно (скорее всего, он будет жаловаться).

Если первый список - это MyAppCache.m, вам необходимо переместить @interface в MyAppCache.h.

Также обратите внимание, что ваш код страдает от двойной инициализации: [[MyAppCache alloc] init] - это фактически [[[MyAppCache sharedCache] retain] init]. Я не знаю, что делает NSCache при вводе дважды, но это, вероятно, не очень хорошо. Я действительно не стал бы беспокоиться об использовании copyWithZone: (Я уверен, что объекты по умолчанию не копируются), и вы можете просто переопределить allocWithZone: создать исключение.

(А + sharedCache не поточно-, которые могут или не могут быть проблемой.)

+0

так что они разбиты на файлы .h и .m, я объединил их здесь, потому что я думал, что будет работать одинаково в любом случае - (?) Я не думаю, что когда-либо звоню [[MyAppCache alloc ] init]. Хорошее количество кода, в том числе copyWithZone приходит отсюда (внизу страницы): http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html –

+0

Теперь я редактирую код, чтобы показать деление на файлы .h и .m –

Смежные вопросы