Sim e não. Você acabaria liberando a memória da string, mas "vazando" o objeto NSAutoreleasePool na memória usando drenagem em vez de liberação se executasse isso em um ambiente de coleta de lixo (não gerenciado por memória). Esse "vazamento" simplesmente torna a instância de NSAutoreleasePool "inacessível" como qualquer outro objeto sem ponteiros fortes em GC, e o objeto seria limpo na próxima vez que GC fosse executado, o que poderia muito bem ser diretamente após a chamada para -drain
:
drenar
Em um ambiente com coleta de lixo, aciona a coleta de lixo se a memória alocada desde a última coleta for maior que o limite atual; caso contrário, se comporta como liberação. ... Em um ambiente com coleta de lixo, esse método finalmente chama objc_collect_if_needed
.
Caso contrário, é semelhante ao -release
comportamento em não-GC, sim. Como outros afirmaram, -release
é um ambiente autônomo no GC, então a única maneira de garantir que o pool funcione corretamente no GC é através -drain
, e -drain
no não-GC funciona exatamente como -release
no não-GC, e pode-se dizer que comunica sua funcionalidade mais claramente conforme bem.
Devo ressaltar que sua instrução "qualquer coisa chamada com new, aloc ou init" não deve incluir "init" (mas deve incluir "copiar"), porque "init" não aloca memória, apenas configura o objeto (construtor moda). Se você recebeu um objeto alocado e sua função apenas chamada init como tal, você não o liberaria:
- (void)func:(NSObject*)allocd_but_not_init
{
[allocd_but_not_init init];
}
Isso não consome mais memória do que você já começou (assumindo que o init não instancia objetos, mas você não é responsável por eles).