Adicionando objetos string para NSMutableArray?
-
07-07-2019 - |
Pergunta
Eu tenho um pequeno teste ferramenta fundação (Objective-C) que eu estou jogando com e eu tenho algumas perguntas ...
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
int planetLoop;
NSString *tempString;
NSMutableArray *planetArray = [[NSMutableArray alloc] init];
NSLog(@"STRING ARRAY ... Start");
for(planetLoop=0; planetLoop<10; planetLoop++) {
tempString = [NSString stringWithFormat: @"Planet_%03d", planetLoop+1];
NSLog(@"Planet_%03d", planetLoop+1);
[planetArray addObject:tempString];
}
[planetArray release];
[pool drain];
return 0;
}
Em primeiro lugar, geralmente eu liberar um objeto após adicioná-lo para uma matriz, mas estou certo em pensar que o que eu tenho atualmente é certo, porque "tempString" é um literal de cadeia, e como tal não precisa ser alocada ou liberada ?
Em segundo lugar, quando eu executar este (antes da execução) recebo a seguinte eror "incapaz de ler comando de carregamento desconhecido 0x80000022" se este um problema com o meu código? a partir de pesquisa no Google parece que ele poderia ser um bug no Xcode 3.1.2, alguém tem alguma idéia?
Finalmente alguma coisa que eu estou fazendo errado, a idéia é preencher uma matriz com 10 string "Planet_001" até "Planet_010"
EDIT:. Ah, eu vejo, isso é por causa do "= [NSString" mordeu ou seja
// Autoreleased object
tempString = [NSString stringWithFormat: @"Planet_%03d", planetLoop+1];
// String literal
tempString = @"Planet_";
Muito obrigado, muito apreciada -Gary -
Solução
tempString
não é realmente um literal string. @"Planet_%03d"
é um literal string. tempString
é um objeto autoreleased, o que significa que ele será liberado quando o NSAutoreleasePool é drenado. Basicamente, a memória já é gerenciado e você não tem que fazer nada.
A regra é: Se você new
, alloc
, copy
ou retain
um objeto, então você tem que release
-lo. Caso contrário, a memória já é gerido, provavelmente por um disparo automático.
Além disso, você esqueceu de pool
liberação. Fora isso, ele parece estar bom.
Outras dicas
Uma possível razão para o "incapaz de ler comando de carregamento desconhecido 0x80000022" aparece erro ser que eu tenha atualizado para o Snow Leopard sem atualizar as ferramentas de desenvolvedores ao mesmo tempo. Parece que o erro pode ser causado pela tentativa de usar a versão 10.5 para o Xcode para compilar em um ambiente 10.6. Vou olhar para isso amanhã.
Xcode 3.2 está agora disponível na versão Snow Leopard (Mac OS X 10.6). Depois de instalar o Snow Leopard, atualize para o Xcode 3.2, instalando-o em separado a partir da imagem de disco Ferramentas Xcode. Você pode instalá-lo em relação às versões anteriores do Xcode, ou movê-los de lado antes de instalar.
PS: Quando recebi o "incapaz de ler comando de carregamento desconhecido 0x80000022" erro Eu estava correndo OSX 10.6.1 com o Xcode 3.1.2
aplausos -Gary -
Esse erro "comando de carregamento" é devido ao fato de que o formato executável mudou de iPhone OS 3.0 para o iPhone OS 3.1.
http://networkpx.blogspot.com/2009/09 /about-lcdyldinfoonly-command.html