Подкласс NSCache - App Singleton - PullRequest
       6

Подкласс NSCache - App Singleton

0 голосов
/ 18 августа 2010

Я пишу приложение для 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» может не отвечать на «метод» для каждой из этих строк.

Iможет быть, здесь что-то совершенно не так - знаете, как заставить это работать?

Ответы [ 2 ]

1 голос
/ 18 августа 2010

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

Если первый листинг - MyAppCache.m, вам нужно переместить @interface в MyAppCache.h.

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

(И + sharedCache не является поточно-ориентированным, что может быть или не быть проблемой.)

0 голосов
/ 18 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...