Pergunta

Esta questão pode ser fora da base, mas aqui está o problema que estou tendo:

Eu estou tentando executar um exemplo do iPhone SDK, e eu estou correndo em uma violação de acesso. Eu rastreado para baixo alguns comportamentos que eu acho que é suspeito.

Aqui está o que os olhares classe como:

@interface TableViewCell : UITableViewCell {

@private    
    UILabel *_earthquakeLocationLabel;
    UILabel *_earthquakeDateLabel;
    UILabel *_earthquakeMagnitudeLabel;
    UIImageView *_magnitudeImageView;
}

Quando eu definir um ponto de interrupção no

- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier

E olhada "eu" no depurador, isso mostra que _earthquakeDateLabel é "0x12", _earthquakeMagnitudeLabel é 0x1000, e os outros dois são zero. Se eu tentar atribuir a qualquer dos mais diferentes de zero, eu recebo uma violação de acesso.

Eu estou supondo que está acontecendo é que estes têm valores falsos neles, e quando eu tentar atribuir a eles, que tenta diminuir uma referência sobre o valor falso e explode. Mas como eu disse, eu sou bastante novo para Objective C, para que eu possa estar fora da base.

Então, minha pergunta é, existe especial nada sobre inicializar esses valores que eu deveria estar fazendo? Ou qualquer forma de atribuir ao valor quando se tem um valor falso nele?


Algumas informações adicionais:

Então, se eu atribuir nil para _earthquakeDateLabel e _earthquakeMagnitudeLabel em initialize, que corrige o problema. Mas eu não entendo por que o objeto é criado com valores nesses campos; Eu espero que eles sejam nulas. O objeto está sendo criado na pilha:

TableViewCell *cell = [[[TableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];

Nenhuma solução correta

Outras dicas

Parece que o ponteiro self é falso. Os valores 0x12 e 0x1000 são constantes número inteiro; eles são definitivamente não ponteiros para endereços de memória válido. O fato de que você está vendo esses valores indica que algo está errado, e tentar manipulá-los de qualquer forma (leitura ou escrita-los) resultará em maldade. Neste caso, você está recebendo uma violação de acesso porque você está tentando escrever para endereços de memória 0x12 e 0x1000, que são endereços inválidos.

Como você está criando os objetos TableViewCell? Você está fazendo TableViewCell *myCell = [[TableViewCell alloc] initWithFrame:...]? Esse é o caminho correto.

Agora vou chamar o meu depurador psíquica: o meu palpite é que você está esquecendo de declarar seu objeto TableViewCell com um ponteiro, ou seja, você está declarando-lo como TableViewCell myCell vez de TableViewCell *myCell ( observar a presença de um asterisco). Isto irá criar o objeto na pilha em vez da pilha, e, como resultado, ele terá de lixo em seus membros de dados, em vez de zeros. Objective-C objetos, quando devidamente alocado, terá todos os seus membros de dados inicializados a 0 (ou NULL, nil ou false, dependendo do tipo de dados) após uma chamada bem-sucedida para alloc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top