Tenho algum código Objective C compilado com ARC:
void func(void) {
NSString *string;
// Do some stuff. Maybe return early.
string = @"initialized";
// Other stuff.
}
Como o ARC lida com um ponteiro de objeto não inicializado? Eu assumo que, como um ponteiro C, string
inicialmente contém lixo de pilha. Se sim, então como o ARC sabe o que fazer com ele se, digamos, eu retornasse antes de inicializar a variável?
Preciso inicializá-lo para, digamos, nil
, para evitar vazamentos de memória?
Importa se a referência foi para um objeto ou bloco de despacho em vez de um NSObject
?
Na verdade, não é o caso. Dos documentos do Clang ARC :
ou seja, ponteiros de objetos de lixo são inválidos de acordo com as regras ARC
ou seja,
strong
referências são válidas quando apontam paranil
ou um ponteiro de objeto válido. (weak
referências são um pouco mais complicadas)O ponto crucial:
ou seja, quase todas as variáveis são automaticamente
nil
eliminadas pelo ARC por padrão para torná-las válidas para uso.Então, não , você não precisa
nil
expor explicitamente uma variável local definida dessa forma porque isso será feito automaticamente (embora normalmente seja uma boa prática fornecer valores padrão explícitos para tornar o comportamento mais óbvio) e não , não importa se o objeto é um objeto de despacho, bloco ou uma subclasse deNSObject
(porque todos são objetos Objective-C com o mesmo comportamento).Você precisa ter cuidado ao zerar corretamente os ponteiros de objetos contidos em a
union
ou alocados manualmente usandomalloc
, mas esses casos são muito incomuns.