Pergunta

Tendo problemas com fora do escopo NSDate em um aplicativo para iPhone.

Eu tenho uma interface definida assim:

@interface MyObject : NSoObject {
    NSMutableArray  *array;
    BOOL        checkThis;
    NSDate      *nextDue;

}

Agora na implementação eu tenho este:

-(id) init
{
    if( (self=[super init]) ) {
        checkThis = NO;
        array = [[NSMutableArray alloc] init];
        nextDue = [[NSDate date] retain];


                NSDate *testDate = [NSDate date];
    }
    return self;
}

Agora, se eu traçar através da inicialização, antes de eu realmente atribuir as variáveis ??checkThis mostra como booleano. mostra como matriz 0x0 apontador porque este não tenha ben atribuído. Mas o nextDue está mostrando como 'fora do escopo'. Eu não entendo por que isso está fora de alcance, mas as outras variáveis ??não são.

Se eu rastrear através do código até que as variáveis ??são atribuídos, de matriz mostra agora como sendo corretamente atribuído, mas nextDue ainda está fora do escopo. Curiosamente, a variável TestDate é atribuído apenas multa e os shows depurador isso como uma data válida.

Outro ponto interessante é se eu mover o mouse sobre a variável TestDate enquanto eu estou depuração, ele mostra como um tipo de 'NSDate *' que eu esperaria uma vez que é a sua definição. No entanto, o nextDue, que para mim é definido da mesma forma está mostrando como uma '_NSCFDate *'.

Qualquer googling eu fiz sobre o assunto disse que a reter é o problema, mas a sua realmente fora do escopo antes mesmo de eu tentar atribuir a variável.

No entanto, em outra classe, a mesma definição para NSDate ok trabalho. Ele mostra como nil antes de um valor é atribuído a ele. Arghhh

Foi útil?

Solução

Eu também postou esta pergunta no fórum iPhone Dev. A resposta que obtive não parece ser correto. Basicamente, é apenas uma coisa engraçada no depurador. Na verdade, considerando não tão engraçado a quantidade de tempo que eu gasto com ela. Quando eu usar NSLog para ver o resultado da variável, ele realmente mostrar o valor corretamente.

O NSDate contra _NSCFDate questão é como disse Stephen, uma ponte toll-free.

Outras dicas

Eu não estou certo porque gdb está lhe dizendo a data está fora do escopo, mas tente remover a reter. [Data NSDate] não requer uma reter.

Eu vi comportamento whacky assim quando eu estou depuração e eu esqueci que eu ainda estou compilando minha binário no modo de versão.

Você também deve verificar se você tiver desativado Símbolo Lazy Loading no Xcode.

Você tem algumas perguntas aqui.

Em primeiro lugar, w hy estão algumas dicas para 0x0 e outros para antes init completou? Bem, eles não foram inicializados! Seus valores não pode ser invocado até que você tenha inicializado eles. O fato de que alguns deles são nil (0x0) não é algo que você deve confiar.

Em segundo lugar, porque é nextDue não atribuído corretamente? isso soa como uma otimização pelo compilador. Verifique se você está no modo de depuração (ou seja, sem otimizações). Veja qual é o valor, em algum momento mais tarde, após o método init tem preenchido e devolvido. Você pode também gostaria de mudar a inicialização para [[NSDate alloc] init] que elimina a necessidade de manter o valor.

Em terceiro lugar: NSDate contra _NSCFDate . Basicamente NSDate tem uma ponte "toll-free" com CFDate (o nível mais baixo, C-like API para a mesma coisa). O compilador aparentemente está querendo mostrar a versão CoreFoundation em vez do definido em seu código. Não é grande coisa; Eu não me preocuparia com isso.

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