Проблема с доступом к NSMutableString

Поэтому я хотел бы получить доступ и отобразить отформатированную дату вне моей функции. Для формата даты я использую NSDateFormatter, который отлично работает.

Моя функция (didFinishUpdatesSuccessfully) выполняет какое-то действие и в случае успеха отображает UIAlertView, который включает отформатированную дату. Все нормально работает..

- (void) didFinishUpdatesSuccessfully {

    //--- Create formatted date
    NSDate *currDate = [NSDate date];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
        [dateFormatter setDateFormat:@"dd/MM/YYYY - hh:mm:ss a"];
    NSString *dateString = [dateFormatter stringFromDate:currDate];     // dateString contains the current date as a string

    [dateFormatter release];


    //--- UIAlertView
    NSString *title = @"The update has been performed!";

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle: title
                                                    message: dateString
                                                   delegate: nil
                                          cancelButtonTitle: [FileUtils appResourceForKey:@"UPDATE_GENERAL_BUTTON_TITLE_OK"]
                                          otherButtonTitles: nil];
    [alert show];
    [alert release];

    //--- create new string
    // NSMutableString* lastUpdated = [NSMutableString stringWithFormat:@"%@",dateString];

}

Теперь я хочу записать значение dateString в глобальный NSString или NSMutableString и получить к нему доступ где-то еще в коде, например. другая функция и т.д..

Я думал создать NSMutableString вот так: NSMutableString* lastUpdated = [NSMutableString stringWithFormat:@"%@",dateString]; и получить доступ к lastUpdated где-то еще, но за пределами этой функции lastUpdated пусто... Можете помочь? Ваше здоровье


person Jan    schedule 25.07.2011    source источник


Ответы (2)


NSMutableString* lastUpdated = [NSMutableString stringWithFormat:@"%@",dateString];

Если вы сделаете это, вы объявите локальную переменную с именем lastUpdated. Даже если есть другая глобальная переменная с таким же именем, эта локальная переменная будет скрывать глобальную переменную до тех пор, пока она находится в области действия (срок службы вашей функции).

Чтобы это работало, вам нужно объявить глобальный lastUpdated где-то за пределами какой-либо функции или метода, возможно, в верхней части .m-файла:

NSMutableString *lastUpdated;

Затем вы можете получить доступ к этой переменной из любого места в файле .m. Если вы хотите получить к нему доступ в других файлах .m, вам нужно добавить объявление extern в соответствующий файл заголовка (.h):

extern NSMutableString *lastUpdated;

С этим объявлением вы можете использовать lastUpdated в любом файле, который включает этот заголовочный файл.

Две вещи, которые нужно знать:

  1. Это базовые вещи C, поэтому, если они кажутся вам незнакомыми, вам следует просмотреть правила области видимости для C. Знайте разницу между глобальной переменной, статической переменной, локальной переменной, переменной экземпляра (хорошо, в старом простом C нет этих ) и параметр.

  2. Глобальные переменные ужасны. Не верьте никому, кто говорит вам обратное. Я предлагаю приведенный выше совет, чтобы помочь решить вашу насущную проблему, но лучшим решением было бы выяснить, как реорганизовать ваш код, чтобы вы могли избежать необходимости в глобальной переменной. (И IMO синглтон тоже не является ответом. Синглтоны, используемые только для доступа к глобальным данным, не намного больше, чем глобальные переменные причудливых штанов.)

person Caleb    schedule 25.07.2011
comment
Спасибо за ответ. Что ж, мне не очень нравится использовать глобальные переменные, и я согласен с комментариями, сделанными по этому поводу... Я хочу сохранить и отобразить значение 'lastUpdate' (дата последнего успешного действия где-то перед UIAlertView запускает currentDate (сейчас), поэтому пользователь может решить не обновлять, если это не имеет смысла... Думаю, я мог бы добавить подпредставление с меткой в ​​'didFinishUpdatesSuccessfully' Проблема здесь в том, что метки будут сложены друг на друга с новым значением... Есть ли в этом смысл?Любая другая идея? - person Jan; 25.07.2011
comment
Трудно сказать вам, как реорганизовать ваш код, не зная о нем больше, например, где живет -didFinishUpdatesSuccessfully. Поскольку это звучит как метод делегата, я предполагаю, что он находится в контроллере представления. Итак, я предполагаю, что вы, вероятно, захотите сохранить дату последнего обновления где-нибудь (возможно, NSUserDefaults), где контроллер может получить к ней доступ. Затем позвольте контроллеру представления получить дату, превратить ее в строку и установить значение существующей метки в эту строку. Контроллер представления отвечает за представление, поэтому он должен знать, как найти метку. - person Caleb; 25.07.2011
comment
Спасибо, Калеб, ты угадываешь правильно. Это делегат в контроллере представления. Сохранение значения в NSUserDefaults кажется разумным. Теперь мне нужно понять, как это сделать. Доступен фрагмент? Спасибо - person Jan; 25.07.2011
comment
[[NSUserDefaults standardDefaults] setObject:currDate forKey:@"lastUpdatedDate"]; Существует весь документ на эту тему. ;-) - person Caleb; 25.07.2011

Вы должны сохранить строку как.

NSMutableString* lastUpdated;
lastUpdated = [[NSMutableString stringWithFormat:@"%@",dateString] retain];

Теперь попытайтесь получить доступ снаружи.

person Sisu    schedule 25.07.2011
comment
Если эти две строки должны отображаться рядом друг с другом, вы не решили проблему. Вторая строка имеет смысл только внутри метода или функции. Если первая строка также появляется в этом методе или функции, lastUpdated является локальной переменной. Чтобы сделать его глобальным, первая строка должна быть вне области действия любого метода или функции. Однако вы правы, что строку нужно сохранить. Выяснить, кто должен сохранить строку, а кто должен ее освободить, сложно, если строка является глобальной; считайте это еще одной причиной не использовать глобал. - person Caleb; 25.07.2011