Ir para conteúdo
  • Cadastre-se

Dúvida com Uso de Memória


Posts Recomendados

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!

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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??

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

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?

Link para o comentário
Compartilhar em outros sites

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)?

Link para o comentário
Compartilhar em outros sites

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.

Link para o comentário
Compartilhar em outros sites

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
Link para o comentário
Compartilhar em outros sites

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…

×   Você colou conteúdo com formatação.   Remover formatação

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Limpar editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Quem Está Navegando   0 membros estão online

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



  • Estatísticas do Fórum

    • Total de Tópicos
      56k
    • Total de Posts
      465.5k
×
×
  • Criar Novo...