0

我一直在通过我的第一个iPhone应用程序慢慢搅动,除了在一本书的上下文中学习外。我想要的是一个跟踪是否有人登录到应用程序的全局变量。在过去的C++中,我所做的是在我的“main”函数文件中声明一个变量,然后在我的其他文件中重新声明它为extern。我已经用Objective-C尝试过了,但是在调试泄漏时我遇到了内存管理问题。这是我正在尝试使用的代码。Single,global,object instance

主要文件

#import "clsPerson.h" 

clsPerson *LoggedInPerson = nil; 

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

[应用] _Prefix.pch * - 前缀文件

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

登录代码 - 登录之上 - 视图 - 控制器(模式弹出根)

我在这里还应该提到,它目前检查变量是否为。如果是,那么它会强制你登录。为了使用零,我相信我必须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]; 
    ... 
} 
... 

这似乎很好地工作,不会产生任何错误,但该应用观看与泄漏显示,我的配置语句某处泄漏内存。通常情况下,如果我注销,强制执行“内存不足警告”,然后重新登录。这里有什么明显的问题吗?我仍然在掌握内存管理方面的经验,但我认为我非常接近。感谢您提前提供任何帮助!

回答

0

因此,如果您刚刚分配了对象,则不需要保留该对象。保留数将已经为+1。

但是,另一个问题是你应该在发布它当用户注销,而不是释放它。你不应该直接调用dealloc。

+0

我已经试过,并且仍然告诉我存在内存泄漏。在同一行中分配和分配有效吗?当它被分配到的功能超出范围时(即使我有全局参考),泄漏是否会对内存泄漏产生误报?如果我在这里做错了什么,或者如果这是一个漏洞,我应该让自己紧张起来,我有点困惑。我喜欢无泄漏,但我几乎看不到它发生。 – jocull 2010-11-07 03:47:04

+0

很难说任何明确的,没有明显看到泄漏告诉你什么。泄漏并不完美,但根据我的经验,它处理这样的全局变量(许多人将单身人士视为一个全局非常类似的人)。是的,分配/初始化和分配在一行是正常的。 – 2010-11-07 04:04:20

+0

我得看看我是否不能把它追到那么...... – jocull 2010-11-07 04:35:40