0

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

главный файл

#import "clsPerson.h" 

clsPerson *LoggedInPerson = nil; 

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

[App] _Prefix.pch * - файл Приставка

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

Войти код - Вход контроллера (Модальные всплывающие окна на вершине Root)

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

... 
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]; 
    ... 
} 
... 

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

ответ

0

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

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

+0

Я пробовал это так и все еще говорил, что есть утечки памяти. Правильно ли назначать и выделять в одной строке? Когда он выходит за пределы области действия в функции, которой он был назначен (хотя у меня есть глобальная ссылка), утечки бросают ложный положительный результат на утечку памяти? Я немного смущен, если я даже делаю что-то неправильно здесь, или если это утечка, я должен напрягаться. Мне бы хотелось, чтобы у вас была утечка, но я почти не вижу, чтобы это произошло. – jocull

+0

трудно сказать что-нибудь окончательное, не зная, что скажет вам утечка. Утечки не идеальны, но, по моему опыту, он справляется с такими глобальными глобалами (многие люди делают синглтоны как глобальные, очень похожие на это). И да, alloc/init и назначить в одной строке нормально. –

+0

Я должен посмотреть, не могу ли я преследовать его тогда ... – jocull