NSMutableArray, indexOfObject :, NSNull e NSNotFound (Xcode para iOS)

Criação de um array com objetos vazios

NSMutableArray é uma classe útil para ordenar objetos e mantê-los em ordem. Então, vamos supor que temos um determinado número de itens, por exemplo, páginas em um livro. Podemos querer colocar cada visualização, ou controlador de visualização, que representa uma página do livro no local correto do array, mas não queremos necessariamente que todas as páginas sejam mantidas no array de uma vez.

Portanto, em primeiro lugar, precisamos de um array de objetos vazios. E digamos que gostaríamos que tivesse 20 objetos de comprimento.

NSMutableArray *pagesArray = [[NSMutableArray alloc] init];
int i = 0;
for (i < 20)
 
{
[pagesArray addObject:[NSNull null]]
i
++;
}

Substituindo objetos vazios por objetos reais

Agora temos um array no qual podemos inserir nossos objetos de página em seus lugares corretos.

[pagesArray replaceObjectAtIndex:10 withObject:page11]

É claro que, em uso real, teríamos instanciado o que quer que seja o nosso objeto page11, mas por enquanto é o array no qual estamos interessados.

Saber onde as coisas estão na matriz

Agora chegamos às coisas realmente úteis. Suponha que você tenha adicionado uma subvisão à sua visão atual, ou o aplicativo tenha feito isso para você de alguma forma, ou o usuário tenha. E agora queremos saber qual página está sendo exibida no momento. Em vez de adivinhar, simplesmente pedimos a resposta do PagesArray porque, seja qual for a página, a teríamos colocado no lugar correto quando fosse para a tela e depois esquecemos de mantê-la sob controle, porque não precisamos, não quando podemos apenas chamar indexOfObject: para fazer o trabalho e nos dizer onde está no array e a partir disso saberemos o número da página, assim:

[pagesArray indexOfObject:pageView]

Como obtemos o ponteiro para a visualização não é discutido aqui, mas podemos alternar entre as subvisões ou teremos algum tipo de ponteiro para retê-lo. Podemos alternativamente receber uma visão ou controlador de visão em um método pelo sistema e não saber se a visão está ou não em nossa lista de páginas.

Quando usar NSNotFound

Se não sabemos se a página está ou não em nosso array, usamos novamente indexOfObject, mas não podemos usá-lo para testar como você faria:

if ([pagesArray indexOfObject:pageView]) {
//do something
}

Isso ocorre porque indexOfObject sempre retorna um número. Acontece que, se o item não estiver na matriz, o número é o número máximo possível; um número que é igual a NSNotFound. Portanto, saberíamos se uma página não estivesse em nossa matriz testando desta forma:

if ([pagesArray indexOfObject:pageView]==NSNotFound) {
//the page isn't in our array
}
else {
//the page is in our array
}

Fontes

http://stackoverflow.com/questions/5754798/ios-nsmutablearray-initwithcapacity
http://stackoverflow.com/questions/10929929/indexofobject-return-2147483647

Postagem de blog original

http://sketchytech.blogspot.co.uk/2013/12/nsmutablearray-indexofobject-nsnull-and.html