我对Objective-c编程和发布对象的新手是我最头疼的问题。 我总是怀疑需要释放什么,而我的时代我最终会发布错误的变量并导致BAD EXEC崩溃。 我已经阅读了关于内存管理的苹果指南,但我总是不能从他们的示例转到我的代码。
其中一种情况是我的单身人士(我是一个大单身人士)。
我有一个定义如下:
static Configuration* _instance;
+(Configuration*)getInstance{
if (_instance == NULL){
_instance = [Configuration alloc];
[_instance initConfig];
}
return _instance;
}
在我的代码中我使用它:
//Store configuration
Configuration* conf = [Configuration getInstance];
conf.userName = self.userName.text;
conf.cellPhone = self.phoneNumber.text;
我是否需要发布“conf”变量?
我应该何时发布_instance?
由于我在iPhone上运行此代码,我不发布的vars会发生什么?它们会影响iPhone的性能吗?
答案 0 :(得分:8)
使用“_instance = [Configuration alloc]; [_instance initConfig];”创建配置实例时它在alloc调用中有一个保留计数。如果你在“conf.cellPhone = self.phoneNumber.text;”之后释放conf。然后它将在那时被解除分配。
当您首次使用alloc,copy或mutableCopy创建对象时,它的保留计数为1.每次保留的调用都会增加,将计数保留为1。每次调用释放减少,保留计数为1.调用自动释放只是意味着“稍后给我释放呼叫”,所以如果保留和释放就像检查一样,自动释放就像将来约会检查一样。
访问配置单例的代码不保留,复制或可变复制它,因此不应该释放它。
当您的代码现在被编写时,Configuration对象将永远不会被释放,并且将在整个应用程序生命周期中存在,这通常是您想要的单例。
答案 1 :(得分:2)
您无需保留conf
变量,因为您尚未保留它。
根据经验,您需要平衡对增加保留计数的方法的调用与减少它的方法。
init
,retain
,递增它,而release
递减它。
卸载类时会释放主_instance,所以我认为你不需要关心它。