Почему мои методы возвращают разные значения для одной и той же переменной

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

Мой заголовочный файл выглядит примерно так:

@property (nonatomic) double time;

Моя реализация выглядит примерно так:

@implementation MainVewController

@synthesize time;

- (void) viewDidLoad
{ 
    startTime = NSDate.date;
}

- (double) returnTime {
    NSLog (@"time is disappearing?? %f", time);
    return time;
}

- (double) logTime {
    NSLog (@"for some reason, this one is working and returns a value %f", time);
    return time;
}

Мой другой класс запрашивает мой дубль:

@synthesize mainViewController = _mainViewController ;

- (MainViewController *)mainViewController {
    if (!_mainViewController) _mainViewController = [[MainViewController alloc] init];
    return _mainViewController;
}

- (BOOL)getTime {
    double timeGotten = [self.mainViewController returnTime];
    // why does this return 0?
    return TRUE;
}

Переменная времени постоянно обновляется в MainVewController:

time = [[NSDate date] timeIntervalSinceDate: startTime];

person Scott Hillson    schedule 20.06.2012    source источник
comment
Где объявлена ​​переменная времени по отношению к двум методам?   -  person Benjamin Gale    schedule 21.06.2012
comment
Как вы можете говорить, что об этом не спрашивали где-то еще? К вашему сведению, вы НЕ ВОЗВРАЩАЕТЕ ДВОЙНОЙ .... и ваш двойник time может не существовать. Установите точку останова. Сначала попробуйте проверить, существует ли ваш self.mainViewController, затем проверьте значение времени и, пожалуйста, ВЕРНИТЕ его, если оно понадобится timeGotten.   -  person Legolas    schedule 21.06.2012
comment
И returnTime, и logTime вернут одно и то же значение для кода, который вы показали. Насколько мы видим, вы никогда не устанавливаете значение времени.   -  person Benjamin Gale    schedule 21.06.2012
comment
Привет @Benjamin, я еще немного обновил код, чтобы дать вам представление о том, каким должно быть время, оно в секундах, и да, оба метода должны возвращать одно и то же значение, но это не так! Вот некоторые логи: 2012-06-20 13:19:01.084: время уходит??? 0.000000 20-06-2012 13:19:01.084: почему-то этот работает и возвращает значение 9.901174   -  person Scott Hillson    schedule 21.06.2012


Ответы (3)


В первый раз, когда ваш «другой класс» запрашивает self.mainViewController, он создает новый. Я предполагаю, но, поскольку он называется MainViewController, вероятно, один из них уже существует до того, как «другой класс» создаст свой собственный новый.

Это первое MainViewController, вероятно, где происходят обновления.

person Phillip Mills    schedule 20.06.2012

В объявлениях функций вы указываете, что функция возвращает переменную типа double, но вы никогда не вводите оператор return, возвращающий значение типа double.

Надеюсь это поможет!

person pasawaya    schedule 20.06.2012

Ваш код не рассказывает всю историю. Я воспроизвел ваш код в новом приложении какао. Есть несколько незначительных отличий, однако логика остается неизменной.

Мой AppDelegate.h выглядит так:

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (nonatomic) double time;

@property (assign) IBOutlet NSWindow *window;

@end

AppDelegate.m выглядит так:

#import "AppDelegate.h"

@implementation AppDelegate

@synthesize window = _window;

@synthesize time;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSDate * startTime = [NSDate date];
    time = [[NSDate date] timeIntervalSinceDate: startTime];

    NSLog(@"Return time %f",[self returnTime]);
    NSLog(@"Log time %f", [self logTime]);
}

- (double) returnTime {
    return time;
}

- (double) logTime {
    return time;
}

@end

Скопируйте этот код в новый проект какао и запустите приложение, и вы увидите, что оно работает правильно. На моей машине вывод консоли выглядит так:

2012-06-21 20:02:17.832 test[298:403] Return time 0.000003
2012-06-21 20:02:17.833 test[298:403] Log time 0.000003

Есть ряд вещей, которые могут быть неправильными в вашем коде, но большинство из них — просто предположения, без дальнейшего кода. Во-первых, у вас может быть несколько экземпляров mainViewController, как упоминал Phillip Mills (у вас может быть экземпляр в файле пера, а также, например, передавать в экземплярах владельца файла пера), что означает, что вы вызываете методы, которые возвращают разные временные переменные.

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

Примечание: в вашем коде также была небольшая ошибка. Эта строка:

NSLog ("for some reason, this one is working and returns a value %f", time);

должно быть (обратите внимание на знак @):

NSLog (@"for some reason, this one is working and returns a value %f", time);

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

person Benjamin Gale    schedule 21.06.2012