No iPhone, eu executo uma solicitação HTTP usando NSURLRequest para um bloco de dados. A alocação de objetos aumenta e eu atribuo os dados de acordo. Quando eu termino com os dados, eu os libero de acordo - no entanto, os instrumentos não mostram que nenhum dado foi liberado!
Minha teoria é que, por padrão, as solicitações de HTTP são armazenadas em cache - não quero que meu aplicativo para iPhone armazene esses dados em cache.
Existe uma maneira de limpar esse cache após uma solicitação ou evitar que qualquer dado seja armazenado em cache em primeiro lugar?
Tentei usar todas as políticas de cache documentadas um pouco como a seguir:
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
theRequest.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;
mas nada parece liberar a memória!
cocoa-touch
caching
Nick Cartwright
fonte
fonte
Respostas:
Normalmente é mais fácil criar a solicitação como esta
Em seguida, crie a conexão
e implemente o método connection: willCacheResponse: no delegado. Apenas retornar nulo deve bastar.
fonte
NSURLRequestReloadIgnoringCacheData
e implementarconnection:willCacheResponse:
?connection:willCacheResponse:
permite que você não armazene a resposta no cache.NSURLRequestReloadIgnoringCacheData
especifica que a conexão deve carregar a solicitação sem verificar o cache. O primeiro é provavelmente o que ajuda a gerenciar a alocação de memória.Eu tenho o mesmo problema no meu aplicativo quando solicitei informações do twitter. No meu caso, não precisei preservar essas credenciais, então simplesmente as apago usando o próximo código:
Espero que funcione para alguém :)
fonte
Se você usar NSURLConnection, dê uma olhada no delegado:
Valor de retorno
A resposta real em cache para armazenar no cache. O delegado pode retornar cachedResponse inalterado, retornar uma resposta em cache modificada ou retornar nulo se nenhuma resposta em cache deve ser armazenada para a conexão.
fonte
Se você estiver usando
NSURLSession
, outra solução para evitar que solicitações e parâmetros sejam gravados noCache.db
iOS cria dentro doCaches
diretório do aplicativo , é definir oNSURLCache
para a configuração da sessão para memória de tamanho 0 e cache de disco de tamanho 0, por exemploou conforme mencionado acima, definido em um nível de cache global
Presumivelmente, é 0 para o tamanho do disco que impede a gravação do iOS no disco, mas se você tiver uma política para
reloadIgnoringLocalCacheData
isso, provavelmente também não está interessado no cache de memória.Observação Isso impedirá que qualquer
Caches/Cache.db
(solicitações e respostas) ouCaches/fsCachedData/
pasta (dados de resposta) seja criada. Decidimos adotar essa abordagem em um aplicativo para fins de segurança, pois não queremos que nossas solicitações sejam armazenadas no cache de disco nunca.Se alguém souber que existe uma maneira de interromper apenas o cache de solicitação, mas manter o cache de dados de resposta do mecanismo de carregamento de URL do iOS, estou interessado em saber. (não há API ou documentação oficial sobre isso pelo que posso dizer)
fonte
Se não for específico para uma única solicitação (você deseja desativar o cache para todo o aplicativo), abaixo de um é a melhor opção. Adicione este código no delegado do aplicativo ou com base em sua necessidade em qualquer lugar
fonte
Assumindo que o servidor está implementado corretamente, colocar o
Cache-Control:no-store
cabeçalho na solicitação irá gerar uma resposta do servidor com o mesmo cabeçalho, fazendoNSURLCache
com que os dados da resposta não sejam armazenados no disco.Portanto, não há necessidade de uma abordagem rápida para desativar
NSURLCache
o cache de disco.PS: Adicionar o cabeçalho deve funcionar para todas as estruturas HTTP, como
AFNetworking
fonte