Pergunta

Estou tendo um problema com o gerenciamento de memória, eu acho. Meu nsarray (chamado ARR) está se transformando em coisas diferentes em momentos aleatórios. Eu não tenho ideia do porquê. Eu tenho um arquivo .h que declara a matriz e depois inicializo a matriz usando

NSString *input = [[NSString alloc] initWithData:myData encoding:NSACIIStringEncoding];
arr = [input componentsSeperatedByString:@"\n"];

E então eu o uso em todo o programa e de repente ele se transforma em coisas diferentes (uitouch, às vezes, por exemplo). Eu nunca liguei para um lançamento. Por que está fazendo isso? Como evito que os objetos sejam alterados aleatoriamente devido a problemas de memória?

Obrigado!

Foi útil?

Solução

Tente reter arr.

arr = [[input componentsSeperatedByString:@"\n"] retain];

Outras dicas

O que acontece, é que a memória, uma vez ocupada pelo seu nsarray, é ocupada por outro objeto. Isso pode ser qualquer objeto e, como você está tocando muito na tela, um uitouch é muito comum.

Isso significa que você não está mantendo o NSARRAY quando deveria, por isso é lançado prematuramente. Você não mostra o código declarando arr, mas se você declarar arr como

@property (nonatomic,retain) NSArray *arr;

e sintetizá -lo usando

@synthesize arr;

então a retenção é tratada simplesmente se tornando self.arr ao invés de arr:

self.arr = [input componentsSeperatedByString:@"\n"];

Em fala de cacau, seu objeto agora "possui" a matriz. No dealloc Método desta classe, você deveria [self.arr release].

Você deve atribuir outra matriz a self.arr, o objeto atribuído a self.arr anteriormente será lançado e o novo retido.

Ou inimentar uma nova matriz com esta matriz:

arr = [[NSArray alloc] initWithArray:input];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top