Pergunta

Chegando ao final do desenvolvimento de um aplicativo para iPhone e estou me perguntando o quão ruim é usar o AutoRelease ao desenvolver para o iPhone. Estou confrontado com algumas falhas razoavelmente aleatórias e, até agora, não consigo identificá -lo a nada além do uso de memória desleixada.

Como novato em cacau, lembro -me de ler inicialmente um documento de diretrizes que sugeriu fortemente evitar o AutoRelease em favor da retenção/liberação manual para o iPhone. No entanto, um desenvolvedor de cacau mais 'sênior' entrou no início (que ironicamente foi libertado desde então), que usou autorlease em todo o lugar. É certo que eu entrei no modo "Monkey See Monkey Do", e parece estar voltando para me assombrar (agora sou o único desenvolvedor do projeto).

Então, o que fazer em seguida? Parece -me que eu tenho que ramificar o código e tentar passar e substituir, sempre que possível, o código automático, mantendo os dedos cruzados, que não quebrei inadvertidamente o aplicativo. Parece que muitas chamadas de biblioteca resultam em objetos autorizados como StringWithFormat e praticamente qualquer coisa em que não estou usando a Alloc. Alguma outra gotchyas e/ou sugestões que eu deveria estar cuidando? Obrigado cacau gurus.

Foi útil?

Solução

Usar a liberação em vez do AutoRelease pode melhorar o uso da memória em pontos apertados (o que é bom no iPhone), mas não ajudará em travar se você não estiver seguindo as regras de retenção / liberação. Eu lia alguns tutoriais sobre gerenciamento de memória no OBJ-C se você ainda estiver um pouco nebuloso com o que deveria estar fazendo e depois vá depois desses acidentes usando o depurador e os relatórios de falhas para descobrir onde você está lançando objetos demais . este e isto são dois bons lugares para começar.

Outras dicas

Mais importante que a opção de autorização automática ou liberação manual é a frequência com que você alloc e dealloc sua NSAutoreleasePools. Como a maioria das estruturas de cacau usa autorelease liberalmente, você precisa ter uma estratégia de drenagem de piscina adequada. Uma vez que ocorre, a escolha de release ou autorelease torna -se muito menos um problema.

Dito isto, as únicas áreas com as quais você deve se preocupar são loops apertados-alocando e liberam um NSAutoreleasePool Cada poucas iterações para obter melhores resultados; E quando você gerou outro NSThread Isso não tem um runloop-crie uma piscina e escorra de vez em quando fica ocioso. Como a maioria dos aplicativos aloca apenas uma pequena quantidade de dados por evento, UIKitA estratégia de alocar o pool antes que o evento seja despachada e libertá -lo depois que os retornos de expedição funcionam muito bem.

Se você acha que não sei como usar o AutoRelease, consulte o CS193P outono de 2010 no iTunes U -> Palestra número 4.

Ensina tudo sobre gerenciamento de memória e outras coisas (se você pular os primeiros 10 minutos ou mais)

Por razões de desempenho do iPhone, a Apple sugere que, sempre que possível, você não deve usar objetos autorizados. Em vez disso, libere explicitamente seus objetos quando terminar com eles.

Usar pools de autorlease significa que você pode deixar uma memória não utilizada por aí. Como o iPhone tem menos memória para circular, você pode melhorar o desempenho se libertar a memória desnecessária o mais rápido possível, em vez de deixá -lo ficar em contorno de recursos enquanto aguarda um autorlease.

Quando você elimina automaticamente, está basicamente dizendo: "Não preciso mais disso, mas qualquer outra pessoa está livre para buscá -lo (antes que o pool de liberação automática seja drenado)". Quando você relaciona explicitamente um objeto que está dizendo: "Não preciso mais disso e, a menos que alguém já tenha dito o contrário (adquirido), ele deve ser desalocado imediatamente".

Consequentemente, o autorlease não é normalmente a coisa errada. É necessário quando você deseja transmitir objetos de volta ao remetente de uma mensagem sem exigir que o remetente cuide de liberar o objeto.

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