iphone global var становится нулевым - PullRequest
0 голосов
/ 20 мая 2011

У меня есть globals.h и appdelegate.h и m.

В globals.h у меня есть:

extern NSString  *databasePath;

в appdelegate.h У меня есть

NSString *databasePath;

в appdelegate.m Я присваиваю значение и печатаю его:

    databasePath = [documentsDir stringByAppendingPathComponent:databaseName];

NSLog(@"Database is:%@", databasePath);

Все хорошо до этого момента. Когда я вызываю другой класс и отображаю данные таким же образом, как исчезает databasePath.

Однако, если я сделаю так, чтобы назначить databasePath, это сработает, и я смогу использовать NSLog, чтобы показать значение:

databasePath =@"XYZZY";

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

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

C глобалы не работают таким образом.

Другие, кажется, предполагают, что у вас есть NSString *database в вашем классе.Но я собираюсь взять ваш вопрос за чистую монету и предположить, что он у вас в свободном доступе в appdelegate.h.

(Кстати, это делает проблему C, а не Objective-C.)

Происходит следующее: каждый раз, когда импортируется appdelegate.h, файл .m, в конечном счете ответственный за импорт, получает новую его копию.

Вы должны иметь extern в appdelegate.h какЧто ж.Неэкстерьер NSString *database должен быть в файле .m.

Objective-C не работает таким образом.

Другая возможность, конечно, в том, что у вас действительно естьNSString *database в вашем классе.Это делает его не глобальной переменной, а переменной экземпляра.Вы не можете объявить его как глобальный, используя extern NSString *database в другом заголовке.То, что вы делаете, это установка переменной экземпляра в вашем AppDelegate и доступ к глобальному файлу с тем же именем из вашего другого класса.

Полностью удалите глобальный объект и просто используйте свой AppDelegate.Вы можете прочитать его, используя аксессор.

Что-то вроде:

id appDelegate = [[UIApplication sharedApplicaiton] delegate];
id databasePath = [appDelegate databasePath];
1 голос
/ 20 мая 2011

[documentsDir stringByAppendingPathComponent:databaseName] возвращает неизвестную строку. Он будет удален из памяти, прежде чем вы попытаетесь использовать его позже. В общем случае это может вызвать сбой типа EXC_BAD_ACCESS. Если вы хотите использовать строку позже, copy или retain, чтобы получить право собственности на нее. Возможно, вы захотите освободить его в методе делегата приложения dealloc (или перед присвоением другого значения вашей глобальной переменной).

В случае с @"XYZZY" вы используете константный строковый литерал, который сохраняется в памяти на протяжении всего времени жизни приложения. Вот почему это работает, как ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...