Ir para conteúdo
Visualizar no app

Uma forma melhor de navegar. Saiba mais.

MM Fórum

Um app em tela cheia na sua Tela de Início com notificações push, avisos e mais.

Para instalar este app no iOS/iPadOS
  1. Toque no ícone de Compartilhamento no Safari
  2. Role o menu e toque em Adicionar à Tela de Início.
  3. Toque em Adicionar no canto superior direito.
Para instalar este app no Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Dúvida com Uso de Memória

Featured Replies

Postado

Olá a todos!

Estou fazendo um app onde algumas vezes preciso de cadeias bem grandes de if's. Gostaria de saber se, trocá-los por switches vai melhorar consideravelmente a performance do app, já que posso usar o brake.

Também queria saber como, além de release os objetos, diminuir o uso de memória ao longo do app.

Qualquer ajuda é bem vinda!

  • Respostas 9
  • Visualizações 1.2k
  • Criado
  • Última resposta

Top Postadores Neste Tópico

Posts Mais Populares

  • Grande NicholasPufal! Vamos trabalhar por partes, como diria o Jack, o estripador. Piada velha... Seu int* x[10]; contém apenas ponteiros para o limbo e perigosos, como você bem sabe. O endere

Postado

Meu caso de uso é: mais de três if encadeados, partir para switch.

Sobre o gerenciamento de memória, release não ajuda você a ter uso menor de memória, isto é gerenciamento de memória. Algo comum ao mundo Ansi C/C++.

A dica para usar melhor a memória, seria você entender muito bem o que é heap e stack. Desta forma, você vai saber gerenciar melhor seus objetos.

Por exemplo, limitar uma função a ter no máximo 16K ocupado no stack. Isto é uma boa dica! Para isto, alocações dinâmicas são bem vindas. Claro, o contexto sempre precisa ser avaliado.

Postado
  • Autor

Entendo... mas achei que alocação dinâmica não fosse necessária em Obj-C. Quanto à stacks, o que eu sei é que tem a ver com as views ficando "umas sobre as outras" como no caso de um app com navigation controller. É justamente nessas horas de passar de um ViewController para outro através de navigation que o app quebra.

Postado

Isto é uma alocação dinâmica em Obj-C:

NSObject* nsObject;
int* i;

nsObject = [[NSObject new] init];

i = malloc(256 * sizeof(int));

Por exemplo...

Seu conceito de heap e stack está errado, sorry.

Procure estudar isto, vai te ajudar e muito, não só no seu problema, mas em tudo relacionado a programação que não seja feita com uma linguagem resguardada por um garbage collection da via.

Vixe! Estava esquecendo. Depois de utilizada, a memória precisa ser liberada. Não fiz isto no trecho de código mais acima.

Editado por franzSilva

Postado
  • Autor

Isto é uma alocação dinâmica em Obj-C:

NSObject* nsObject;
int* i;

nsObject = [[NSObject new] init];

i = malloc(256 * sizeof(int));

Por exemplo...

Seu conceito de heap e stack está errado, sorry.

Procure estudar isto, vai te ajudar e muito, não só no seu problema, mas em tudo relacionado a programação que não seja feita com uma linguagem resguardada por um garbage collection da via.

Vixe! Estava esquecendo. Depois de utilizada, a memória precisa ser liberada. Não fiz isto no trecho de código mais acima.

Certo, o malloc eu conheço, só não entendo como ele pode realocar um objeto, já que ele não faz reefrência ao objeto em momento algum. Vc cria um int i e atribui a ele o malloc. Como isso funciona??

Postado

Não, não! Foi dois exemplos distintos.

A alocação do objeto está sendo feita nesta linha

nsObject = [[NSObject new] init];

Com o malloc eu só fiz uma alocação para uma variável de tipo int.

Only it.

Postado
  • Autor

Não, não! Foi dois exemplos distintos.

A alocação do objeto está sendo feita nesta linha

nsObject = [[NSObject new] init];

Com o malloc eu só fiz uma alocação para uma variável de tipo int.

Only it.

Então se eu fizer algo do tipo:

NSString *string = [[NSString alloc] initWithContentsOfFile:myFile];

ou

NSString *string2 = [[NSString alloc] initWithFormat:@"%d", numeroInteiro];

É o mesmo que o exemplo que você deu?

Postado

franz, aproveitando o tópico do colega.

O conceito de heap e stack é bem novo pra mim.

No caso do C, eu sei que via de regra tudo que é declarado com malloc fica no heap, enquanto que variáveis locais, declaradas dentro do escopo de alguma função, são armazenadas no stack.

Por ex (retirado do Stack Overflow):

int* x[10];   
int i;        
for(i = 0; i < 10; ++i)
   x[i] = malloc(sizeof(int)*10); 

Neste caso eu tenho declarado um vetor de 10 posições e um inteiro no stack. Enquanto o endereço gerado pelo meu malloc, ficará no heap.

Se eu trabalhar deste jeito, armazenando valores nos endereços gerados pelo malloc, eles ficarão todos no heap. Ou seja, o meu stack neste caso é que faz menção de onde eles estão no heap, servindo como uma ponte para eu chegar lá (através dos ponteiros). É isso?

E caso sim, é esse o raciocínio por trás dos tipos em Objective-C? Ter uma série de ponteiros em stack, que apontam para o conteúdo que de fato se encontra no heap (tais como instâncias de objetos)?

Postado

Grande NicholasPufal!

Vamos trabalhar por partes, como diria o Jack, o estripador. Piada velha... :rolleyes:

Seu

int* x[10];

contém apenas ponteiros para o limbo e perigosos, como você bem sabe. O endereço deste limbo está na stack.

Quando você faz:

for(i = 0; i < 10; ++i)
   x[i] = malloc(sizeof(int)*10); 

Você aloca memória na heap. Você terá 10 ponteiros apontando para 10 vetores de 10 posições. O endereço para estes vetores estão na stack e os valores, alocação, data, está na heap.

Concluindo, que você está correto na sua analise! :D

Sobre Obj-C, podemos ter objetos declarados de uma forma global ou no escopo de uma classe. Neste caso, o endereço e data estão no heap.

Da outra forma, seria como já discutimos mais acima.

Postado

Valeu franz!

Muito boa explicação.

Ah, um link interessante que achei também sobre o assunto é este: http://www-ee.eng.hawaii.edu/~tep/EE150/book/chap14/subsection2.1.1.8.html

Tem até um desenho ilustrando o que acontece quando invocamos uma função no main(), e depois retornamos (return) algo com ela.

Eu há tempos ouvia heap/stack (nas aulas de stanford ele falava seguido isso), mas nunca compreendia.

Muito bom mesmo :D

Editado por NicholasPufal

Participe do debate

Você pode postar agora e se registrar depois. Se você tem uma conta, entre agora para postar com ela.

Visitante
Responder este tópico…

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Conta

Navegação

Buscar

Buscar

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.