Эй, ребята, я пишу довольно простое приложение для 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, я чувствую, что мой синглтон реализован неправильно или что-то в этом роде. Я также попробовал более сложную реализацию синглтона, такую как рекомендованная Apple в вышеупомянутой теме, и у меня была та же проблема. Спасибо за любую информацию, которую вы можете предоставить.
В вашем -init
методе вы напрямую обращаетесь к переменным вашего экземпляра и не сохраняете их. Они освобождаются, и их память используется другими объектами позже при жизни вашего приложения.
Либо сохраните свои объекты, которые вы там создаете, либо используйте не удобные методы для их создания.
searchDict = [[NSDictionary alloc] initWithContentsOfFile:finalPath];
searchArray = [[searchDict allKeys] retain];
Всякий раз, когда вы назначаете синтезированные переменные, делайте это через 'self', поэтому:
- (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;
}
Также убедитесь, что вы установили эти переменные так, чтобы они сохранялись в заголовочном файле.
Привет, Можете ли вы сказать мне, в чем преимущество, когда мы присваиваем синтезированные переменные через «я»? Спасибо Шива
значения устанавливаются через установщик; он освобождает предыдущее значение и сохраняет тот, который вы назначаете.