NSDate выходит за рамки - PullRequest
0 голосов
/ 11 июня 2009

Возникли проблемы с выходом за рамки NSDate в приложении для iphone.

У меня есть интерфейс, определенный так:

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

}

Теперь в реализации у меня есть это:

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


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

Теперь, если я прослежу через инициализацию, прежде чем я на самом деле назначу переменные, checkThis показывает, что это логическое значение. массив показывает как указатель 0x0, потому что он еще не назначен. Но nextDue показывается как «вне области видимости». Я не понимаю, почему это выходит за рамки, но другие переменные - нет.

Если я прослеживаю код до тех пор, пока не назначены переменные, массив теперь отображается как правильно назначенный, но nextDue по-прежнему выходит за рамки. Интересно, что переменная testDate назначается просто отлично, и отладчик показывает это как правильную дату.

Еще один интересный момент: если во время отладки я наведу указатель мыши на переменную testDate, она отобразится как тип «NSDate *», чего я и ожидал, поскольку это его определение. Тем не менее, nextDue, который для меня определен так же, отображается как _NSCFDate *.

Любое прибегание к поиску, которое я проводил по этому вопросу, говорило, что проблема заключается в сохранении, но на самом деле оно выходит за рамки, прежде чем я даже попытаюсь присвоить переменную.

Однако, в другом классе, то же определение для NSDate работает нормально. Он показывает как ноль, прежде чем ему будет присвоено значение. Arghhh

Ответы [ 4 ]

1 голос
/ 12 июня 2009

Я также разместил этот вопрос на форуме разработчиков iphone. Ответ, который я получил, кажется правильным. По сути, это просто забавная вещь в отладчике. На самом деле, не так уж и смешно, учитывая количество времени, которое я на это потратил. Когда я использую NSLog для просмотра результата переменной, он действительно показывает правильное значение.

Проблема NSDate и _NSCFDate, как сказал Стивен, является бесплатным мостом.

0 голосов
/ 11 июня 2009

Я видел странное поведение, подобное этому, когда я отлаживаю, и я забыл, что я все еще собираю свой бинарный файл в режиме выпуска.

Вы также должны убедиться, что вы отключили загрузку Lazy Symbol в Xcode.

0 голосов
/ 11 июня 2009

У вас есть несколько вопросов здесь.

Во-первых, w hy - некоторые указатели на 0x0, а другие - до того, как init завершится? Ну, они не были инициализированы! На их ценности нельзя положиться, пока вы их не инициализируете. Тот факт, что некоторые из них nil (0x0) - это не то, на что вы должны полагаться.

Во-вторых, почему nextDue назначен неправильно? Это звучит как оптимизация компилятором. Убедитесь, что вы находитесь в режиме отладки (т.е. без оптимизации). Посмотрите, что это за значение в какой-то более поздний момент после завершения и возврата метода init. Вы также можете изменить инициализацию на [[NSDate alloc] init], что устраняет необходимость сохранять значение.

Третье: NSDate против _NSCFDate. В основном NSDate имеет «бесплатный» мост с CFDate (нижний уровень, C-подобный API для того же самого). По-видимому, компилятор предпочитает показывать версию CoreFoundation, а не ту, которая определена в вашем коде. Это не имеет большого значения; Я бы не волновался об этом.

0 голосов
/ 11 июня 2009

Я не уверен, почему GDB сообщает вам, что дата выходит за рамки, но попробуйте удалить сохранение. [NSDate date] не требует сохранения.

...