Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 单个、全局、对象实例_Iphone_Objective C_Memory Management_Singleton_Global Variables - Fatal编程技术网

Iphone 单个、全局、对象实例

Iphone 单个、全局、对象实例,iphone,objective-c,memory-management,singleton,global-variables,Iphone,Objective C,Memory Management,Singleton,Global Variables,我一直在慢慢地翻阅我的第一个iPhone应用程序,除了在书中学习之外。我想要的是一个单一的全局变量,用于跟踪是否有人登录应用程序。在过去的C++中,我所做的是在我的“主”函数文件中声明一个变量,然后在我的其他文件中声明它为 ExtNe>强>。我已经用Objective-C尝试过了,但在调试泄漏时遇到了内存管理问题。这是我试图使用的代码 主文件 #import "clsPerson.h" clsPerson *LoggedInPerson = nil; int main(int argc, c

我一直在慢慢地翻阅我的第一个iPhone应用程序,除了在书中学习之外。我想要的是一个单一的全局变量,用于跟踪是否有人登录应用程序。在过去的C++中,我所做的是在我的“主”函数文件中声明一个变量,然后在我的其他文件中声明它为<强> ExtNe>强>。我已经用Objective-C尝试过了,但在调试泄漏时遇到了内存管理问题。这是我试图使用的代码

主文件

#import "clsPerson.h"

clsPerson *LoggedInPerson = nil;

int main(int argc, char *argv[]) {
//...main code...
}
[App]\u Prefix.pch*-前缀文件

...
#import "clsPerson.h"
extern clsPerson *LoggedInPerson;
...
登录代码-登录视图控制器(根目录顶部的模式弹出窗口)

这里我还应该提到,它当前检查变量是否为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];
    ...
}
...

这似乎工作正常,不会产生任何错误,但观察应用程序的泄漏情况表明,我的分配语句正在某处泄漏内存。如果我注销,强制发出“内存不足警告”,然后再次登录,通常会发生这种情况。这里有什么突出的问题吗?我仍然在掌握内存管理,但我认为我已经非常接近了。提前谢谢你的帮助

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


但另一个问题是,当用户注销时,您应该释放它,而不是取消分配它。你不应该直接打电话给dealloc。

我试过这样做,但它仍然告诉我内存泄漏。在同一行中分配和分配是否有效?当它超出分配给它的函数的范围时(即使我有一个全局引用),泄漏是否会对内存泄漏抛出假阳性?我有点困惑,如果我在这里做错了什么,或者如果这是一个漏洞,我应该竭尽全力。我很想不泄密,但我几乎看不到它的发生。很难说有什么确切的消息,而不清楚泄密告诉了你什么。Leaks并不完美,但根据我的经验,它可以很好地处理全局事务(许多人将单例作为全局事务处理,与此非常相似)。是的,alloc/init和assign在一行中是正常的。请查找一种情况,即您可能正在分配一个新的clsPerson*,而实际上有一个以前的clsPerson*(非nil)