Preciso alloc explicitamente minha NSNumber?
-
03-07-2019 - |
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
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 .