Pergunta

Eu estou definindo um número, como segue:

NSNumber *nn0 = [NSNumber numberWithInt:0];

Ele funciona muito bem sem qualquer alloc. O meu entendimento é que se eu usar numberWithInt, alloc e inicialização são chamados automaticamente.

Se eu tentar liberar no final da minha função, eu me deparo com problemas:

[nn0 release];

Eu recebo um erro de execução.

A minha pergunta é: se eu usar numberWithInt para inicializar o NSNumber, eu tenho que fazer qualquer gerenciamento de memória nele

Foi útil?

Solução

Os "construtores de conveniência" para um monte de tipos de produzir um objeto que é automaticamente "autoreleased" - ou seja, o novo objeto será retido pela corrente NSAutoreleasePool. Você não precisa liberar manualmente esses objetos -. Eles serão liberados quando a corrente NSAutoreleasePool é liberada / drenado

Veja esta página para uma descrição dos construtores de conveniência, e como gerenciar a memória para estes.

http: // www. macdevcenter.com/pub/a/mac/2001/07/27/cocoa.html?page=3

Outras dicas

Apenas siga a regra de gerenciamento de memória core: Se você "próprio" a variável, você tem que, eventualmente, propriedade abandonar. Você tomar posse por: criar o objeto (alloc / new / cópia) ou especificamente tomar posse (manter). Em todos esses casos, você é obrigado a liberá-lo.

Se você precisa do objeto para ficar por aqui, você precisa tomar posse dela. Então, se você sabe que você só precisa do número para este método (como passá-lo em uma matriz ou qualquer outro), use o método de conveniência e apenas deixar por isso mesmo. Se você quiser manter o número por algum motivo (e variável de instância, por exemplo), então você pode seguramente alloc / init-lo.

Se você soltar algo que você não faz próprio, você receberá um erro de execução.

A regra é simples, com muito poucas excepções:

Se o seletor de retornar um objeto tem a palavra "novo", "alloc", "manter" ou "cópia" nele, então você possui o objeto retornado e são responsáveis ??por liberá-lo quando tiver terminado.

Caso contrário você não possui-lo e não deve liberá-lo. Se você quiser manter uma referência a um objeto não-propriedade, você deve chamar -[NSObject retain] nessa instância. Você agora "próprio" que exemplo, um deve, portanto, chamar -[NSObject release] na instância quando você é feito com ele. Assim você não possui a instância retornada por -[NSNumber numberWithInt:] e não deve chamar -release sobre ele quando você está feito. Se você quiser manter a instância retornada além do escopo atual (muito para além da vigência da instância NSAutoreleasePool atual), você deve -retain-lo.

termos No RegEx, Peter Hosey coloca-lo muito bem em sua blogue . Você possui a instância do objeto retornado se o seletor de método corresponde a esse regex:

/^retain$|^(alloc|new)|[cC]opy/

Claro, a referência definitiva é a Memory Management Programming Guide for cacau .

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