Singleton fonte de dados compartilhada em Objective-C

votos
3

Ei pessoal - eu estou escrevendo um aplicativo de iPhone muito simples. Os dados provêm de um arquivo plist (NSDictionary basicamente), que eu estou tentando carregar em uma única classe e usar em meus vários controladores de vista para acessar os dados.

Aqui está a implementação para o meu singleton (pesadamente modelado após esta discussão )

@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

Assim, sempre que eu tento acessar o searchDict ou propriedades searchArray outro lugar na minha aplicação (como um delegado TableView) assim:

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

Eu recebo uma exceção afirmando *** - [NSCFSet objectAtIndex:]: selector não reconhecido enviada à instância 0x5551f0

Eu não sou realmente certo porque a mensagem objectAtIndex está sendo enviado para um objeto NSCFSet, eu sinto como se meu singleton é implementado errado ou algo assim. Eu também tentei uma implementação singleton mais complexo como o recomendado pela Apple no segmento acima mencionado e tinha o mesmo problema. Obrigado por qualquer visão que você pode proporcionar.

Publicado 10/12/2008 em 09:49
fonte usuário
Em outras línguas...                            


3 respostas

votos
11

Em seu -initmétodo que você está acessando diretamente as variáveis de instância e não estiver a retê-los. Eles estão sendo desalocada e sua memória está sendo usado por outros objetos mais tarde na vida de sua aplicação.

Quer manter seus objetos que você está criando lá ou usar os métodos não-conveniência para gerá-los.

searchDict = [[NSDictionary alloc] initWithContentsOfFile:finalPath];
searchArray = [[searchDict allKeys] retain];
Respondeu 10/12/2008 em 09:59
fonte usuário

votos
1

Sempre que você atribuir variáveis ​​sintetizadas, fazê-lo através de 'self', então:

- (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;

}

Também certifique-se que você configurar as variáveis ​​para ser 'retain'ed no cabeçalho do arquivo.

Respondeu 10/12/2008 em 15:02
fonte usuário

votos
0

Oi, você pode me dizer qual é a vantagem, quando vamos atribuir variáveis ​​sintetizadas através de 'eu'? Obrigado Shiva

os valores são definidos através da incubadora; ele libera o valor anterior e retém o que você atribuir.

Respondeu 03/08/2009 em 09:49
fonte usuário

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