Синглтон общий источник данных в Objective-C

голоса
3

Эй люди - я пишу довольно простое приложение iPhone. Данные поступают из Plist файла (NSDictionary в основном), что я пытаюсь загрузить в класс одноплодного и использовать через мои различные контроллеры просмотра, чтобы получить доступ к данным.

Вот реализация моего одноточечный (сильно смоделирован эта тема )

@implementation SearchData

@synthesize searchDict;
@synthesize searchArray;

- (id)init {
    if (self = [super init]) {
        NSString *path = [[NSBundle mainBundle] bundlePath];
        NSString *finalPath = [path stringByAppendingPathComponent:@searches.plist];
        searchDict = [NSDictionary dictionaryWithContentsOfFile:finalPath];
        searchArray = [searchDict allKeys];
    }

    return self;
}

- (void)dealloc {
    [searchDict release];
    [searchArray release];
    [super dealloc];
}

static SearchData *sharedSingleton = NULL;

+ (SearchData *)sharedSearchData {
    @synchronized(self) {
        if (sharedSingleton == NULL)
            sharedSingleton = [[self alloc] init];
    }   
    return(sharedSingleton);
}

@end

Поэтому всякий раз, когда я пытаюсь получить доступ к searchDict или свойства searchArray в другом месте в моем приложении (например, делегат TableView) следующим образом:

[[[SearchData sharedSearchData] searchArray] objectAtIndex:indexPath.row]

Я получаю исключение с указанием *** - [NSCFSet objectAtIndex]: непризнанные селектор направлен например 0x5551f0

Я не совсем уверен , почему сообщение objectAtIndex направляется на объект NSCFSet, я чувствую , что моя одноточечно реализуется неправильно или что - то. Я также попытался более сложную реализацию одноплодной , как один яблоком , рекомендованному в вышеупомянутой теме и была такая же проблема. Спасибо за любую проницательность вы можете предоставить.

Задан 10/12/2008 в 09:49
источник пользователем
На других языках...                            


3 ответов

голоса
11

В вашем -initметоде вы прямой доступ к переменному экземпляру , и вы не сохраняя их. Они получают высвобождены и их память израсходованная других объектов позже в жизни вашего приложения.

Либо сохранить свои объекты, которые вы создаете там или использовать методы, не удобство для их создания.

searchDict = [[NSDictionary alloc] initWithContentsOfFile:finalPath];
searchArray = [[searchDict allKeys] retain];
Ответил 10/12/2008 в 09:59
источник пользователем

голоса
1

Всякий раз, когда вы назначаете синтезированные переменные, сделайте это через «я», так:

- (id)init {
  if (self = [super init]) {
      NSString *path = [[NSBundle mainBundle] bundlePath];
      NSString *finalPath = [path stringByAppendingPathComponent:@"searches.plist"];
      self.searchDict = [NSDictionary dictionaryWithContentsOfFile:finalPath];
      self.searchArray = [searchDict allKeys];
  }

  return self;

}

Также убедитесь, что вы настроили эти переменные должны быть «retain'ed в файле заголовка.

Ответил 10/12/2008 в 15:02
источник пользователем

голоса
0

Привет, Можете ли вы сказать мне, что это преимущество, когда мы назначаем синтезированные переменные через «я»? Спасибо ShiVa

значения устанавливаются через инкубатор; он освобождает предыдущее значение и сохраняет один присвоенные.

Ответил 03/08/2009 в 09:49
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more