Pergunta

Eu estou tentando salvar duas cordas. Um precisa de corda para ser salvo como tipo matriz no segundo necessidades de cordas Plist e ser salvo as String na matriz.

Eu posso usar o código:

[dicionário setObject: (id) anObject forKey: (id) aKey>]

mas não salvá-lo corretamente. I pode lançar uma das cordas como uma matriz, mas ainda não funciona direito.

O que é o método adequado para salvar uma matriz para o plist?

Aqui está o que os meus Plist parece com:

<dict>
<key>Test One</key>
<array>
    <string>A13#</string>
</array>
<key>Another Test</key>
<array>
    <string>1111111111</string>
</array>
<key>Test Three</key>
<array>
    <string>2222222222</string>
</array>
<key>Final Test</key>
<array>
    <string>3333333333</string>
</array>
</dict>

aqui é o método que estou usando para tentar

-(void)writeToFile:(NSString *)s1{
    NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"saved" ofType:@"plist"];

NSMutableDictionary *dictionary = [[[NSDictionary alloc] initWithContentsOfFile:plistPath] mutableCopy];
NSString *tempString = [NSString stringWithFormat:@"1234567"];
[dictionary setObject:tempString forKey:s1];

[dictionary writeToFile:plistPath atomically:YES];
}
Foi útil?

Solução

Você não pode lançar ou não converter uma string em uma matriz; eles são, objetos distintos separados. É o mesmo que se na vida real você tentar transformar seu cão em um vagão da estação, isso não está acontecendo.

Em vez disso, colocar o seu cão dentro da perua (ou colocar o seu string (s) dentro de um array). Você pode criar a matriz com [NSArray arrayWithObjects:@"string1", @"string2", nil];. Pau que dentro do seu dicionário para uma determinada chave, juntamente com sua seqüência final para outra chave, salvá-lo, e você vai ter um plist com um conjunto de um ou mais strings.

Além disso, no seu exemplo código de seu dicionário está vazando memória. Leia-se sobre o gerenciamento de memória em Objective-C, você vai se deparar com muitas falhas e problemas de desempenho até entendê-lo bem.

Outras dicas

Você um converter uma string para uma única matriz elemento com

[NSArray arrayWithObject:str];

Então, se você quiser que o seu plist para conter entradas como matrizes de cadeias, e você quer apenas uma única corda como um elemento, então você fazer algo como:

[dictionary setObject:[NSArray arrayWithObject:tempString] forKey:s1];

Eu não realmente não por que você quer isto deste modo a menos que você deseja permitir para várias cadeias por chave em algum outro momento.

Além disso, como Marc mencionado, você está vazando a inicial (unmutable) dectionary você cria. Leia as regras de gerenciamento de memória em http://developer.apple. com / documentação / Cacau / conceitual / MemoryMgmt / artigos / mmRules.html .

Além disso, você nunca deve escrever dentro pacote do aplicativo. Por um lado, a sua aplicação pode ser em um volume protegido contra gravação ou o usuário atual pode não ter permissões para alterar isso. Por outro lado, o arquivo seria então compartilhada por todos os usuários. E para um terceiro, que iria quebrar a assinatura de código. Em vez disso, escrever o ficheiro para a pasta Preferências ou a pasta Application Support.

E, finalmente, se estas se destinam a ser as preferências do usuário de algum tipo, então você deve usar o sistema de preferências, que permite a configuração de padrões e armazena as preferências nas preferências de pasta para você. Consulte http://developer.apple.com/documentation/Cocoa/Conceptual /UserDefaults/UserDefaults.html para obter mais informações.

A maneira correta para salvar um NSArray (por si só) para um arquivo plist é o seguinte:

NSArray* anArray = ...;
[anArray writeToFile:@"/path/to/file.plist" atomically:YES];

No entanto, você não pode salvar um NSString como uma matriz. Dada a plist XML que você forneceu, se você quiser adicionar entradas com o mesmo formato, você pode usar este código muito mais simples:

- (void) writeToFile:(NSString *)string {
  NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"saved" ofType:@"plist"];
  NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
  [dictionary setObject:[NSArray arrayWithObject:@"1234567"] forKey:string];
  [dictionary writeToFile:plistPath atomically:YES];
}

Isso também evita um vazamento de memória em seu código, em que o receptor de -mutableCopy escapa com a manter a contagem de 1. (Este não é um problema em GC, mas ainda é uma prática ruim.) Você não deve precisar de uso +[NSString stringWithFormat:], basta usar um literal string. Se você quiser usar um diferente como a string na matriz, você pode passá-lo como um parâmetro adicional, agarrar-lo de outro método, etc.

Este método ainda é frágil na medida em que apenas armazena uma corda na matriz combinado com a chave dada - também, o nome do método seria melhor se fosse mais um indicativo de exatamente o que ele faz. Além disso, se há só vai ser um valor de string para cada tecla, você pode considerar a revisão do plist para omitir as matrizes inteiramente, uma vez que apenas mastiga espaço e complica o código.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top