单个全局对象实例

时间:2010-11-07 01:42:56

标签: iphone objective-c memory-management singleton global-variables

我一直在慢慢地浏览我的第一个iPhone应用程序,而不是在一本书的背景下学习。我想要的是一个单一的全局变量,用于跟踪是否有人登录到应用程序。在过去使用C ++时,我所做的是在我的“main”函数文件中声明一个变量,然后在我的其他文件中将其重新声明为 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,我相信我必须使用alloc和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];
...

退出代码 - 根视图控制器

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

这似乎工作正常并且不会产生任何错误,但是使用Leaks观看应用程序会显示我的分配语句正在某处泄漏内存。如果我退出,强制“低内存警告”,然后再次登录,通常会发生这种情况。这里有明显的问题吗?我仍在掌握内存管理,但我认为我非常接近。感谢您提前提供任何帮助!

1 个答案:

答案 0 :(得分:0)

因此,如果您刚刚分配了对象,则无需保留该对象。保留计数已经是+1。

但另一个问题是,当用户注销时,你应该释放,而不是解除分配。你永远不应该直接调用dealloc。