Одиночный глобальный экземпляр объекта - PullRequest
0 голосов
/ 07 ноября 2010

Я медленно перелистывал свое первое приложение для iPhone, не учась в контексте книги. Я хотел бы иметь единственную глобальную переменную, которая отслеживает, есть ли человек, вошедший в приложение. В прошлом с C ++ то, что я делал, объявлялось как переменная в моем «основном» файле функции, а затем повторно объявлялось в других моих файлах как extern . Я пробовал это с Objective-C, но я сталкиваюсь с проблемами управления памятью при отладке с утечками. Вот код, который я пытаюсь использовать.

основной файл

#import "clsPerson.h"

clsPerson *LoggedInPerson = nil;

int main(int argc, char *argv[]) {
//...main code...
}

[Приложение] _Prefix.pch * - Файл префикса

...
#import "clsPerson.h"
extern clsPerson *LoggedInPerson;
...

Код входа - Контроллер вида входа в систему (модальное всплывающее окно поверх Root)

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

...
LoggedInPerson = [[clsPerson alloc] initWithJSON:(NSDictionary*)Network.JsonValues];
[LoggedInPerson retain]; //I don't really know if this is needed?

//Save this person into the default settings for next time
[LoggedInPerson saveUserInfo];
[[self parentViewController] dismissModalViewControllerAnimated:YES];
...

Код выхода - Root View Controller

...
- (void)btnLogoutTapped {
    [LoggedInPerson dealloc]; //There is only one object, so I tried to force it to dealloc fully
    LoggedInPerson = nil;
    [clsPerson ClearUserInfo];
    ...
}
...

Кажется, это работает нормально и не выдает никаких ошибок, но при просмотре приложения с утечками видно, что в моем операторе размещения где-то происходит утечка памяти. Обычно это происходит, если я выхожу из системы, вырабатываю «предупреждение о нехватке памяти», а затем снова вхожу в систему. Здесь есть какие-то явные проблемы? Я все еще хорошо разбираюсь в управлении памятью, но думаю, что я довольно близок. Спасибо за любую помощь заранее!

1 Ответ

0 голосов
/ 07 ноября 2010

Итак, вам не нужно сохранять объект, если вы только что его выделили.Счет сохранения уже будет + 1.

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

...