Gabriel Vincent Postado 9 de junho de 2011 Denunciar Compartilhar Postado 9 de junho de 2011 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! Citar Link para o comentário Compartilhar em outros sites More sharing options...
franzSilva Postado 9 de junho de 2011 Denunciar Compartilhar Postado 9 de junho de 2011 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Gabriel Vincent Postado 9 de junho de 2011 Autor Denunciar Compartilhar Postado 9 de junho de 2011 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
franzSilva Postado 10 de junho de 2011 Denunciar Compartilhar Postado 10 de junho de 2011 (editado) 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 10 de junho de 2011 por franzSilva Citar Link para o comentário Compartilhar em outros sites More sharing options...
Gabriel Vincent Postado 10 de junho de 2011 Autor Denunciar Compartilhar Postado 10 de junho de 2011 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?? Citar Link para o comentário Compartilhar em outros sites More sharing options...
franzSilva Postado 10 de junho de 2011 Denunciar Compartilhar Postado 10 de junho de 2011 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Gabriel Vincent Postado 10 de junho de 2011 Autor Denunciar Compartilhar Postado 10 de junho de 2011 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
NicholasPufal Postado 10 de junho de 2011 Denunciar Compartilhar Postado 10 de junho de 2011 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)? Citar Link para o comentário Compartilhar em outros sites More sharing options...
franzSilva Postado 10 de junho de 2011 Denunciar Compartilhar Postado 10 de junho de 2011 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ç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! 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. NicholasPufal 1 Citar Link para o comentário Compartilhar em outros sites More sharing options...
NicholasPufal Postado 11 de junho de 2011 Denunciar Compartilhar Postado 11 de junho de 2011 (editado) 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 Editado 11 de junho de 2011 por NicholasPufal Citar Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados
Participe do debate
Você pode postar agora e se registrar depois. Se você tem uma conta, entre agora para postar com ela.