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
Objective c 释放或设置为零保留成员_Objective C_Release_Retain - Fatal编程技术网

Objective c 释放或设置为零保留成员

Objective c 释放或设置为零保留成员,objective-c,release,retain,Objective C,Release,Retain,将我的保留成员变量设置为零还是在清理时释放它们更好?将保留的var设置为nil似乎是一种更安全的释放对象的方法,而不必冒双重释放调用的风险 更新:让我详细说明一下,我指的是已设置为具有retain属性的成员变量,即: @property (nonatomic, retain) SomeClass* mInstanceVar; 最好的做法是先释放实例变量,然后在-dealoc方法中将它们设置为nil。我个人喜欢这样做: [myVar release], myVar = nil; 如果将实例变量

将我的保留成员变量设置为零还是在清理时释放它们更好?将保留的var设置为nil似乎是一种更安全的释放对象的方法,而不必冒双重释放调用的风险

更新:让我详细说明一下,我指的是已设置为具有retain属性的成员变量,即:

@property (nonatomic, retain) SomeClass* mInstanceVar;

最好的做法是先释放实例变量,然后在
-dealoc
方法中将它们设置为
nil
。我个人喜欢这样做:

[myVar release], myVar = nil;
如果将实例变量设置为
nil
,则不会释放它们,并且会导致内存泄漏。在释放Through后将它们设置为
nil
,将确保不会导致泄漏,并且如果出于某种原因,您稍后尝试访问这些实例变量,则不会获得垃圾内存


如果将实例变量设置为这样

@property (retain) NSObject *myVar;
那么调用
self.myVar=nil不是一个好主意在解除分配期间。如果您的实例变量上有已注册KVO通知的对象,则调用
self.myVar=nil
将发送这些通知,而其他对象将收到通知,这是不好的,因为它们希望您仍然处于有效状态,而如果您处于解除分配过程中,则不会

即使它们没有注册KVO通知,这样做仍然不是一个好主意,因为当对象的状态不一致时(某些变量可能/将不存在),您永远不应该调用依赖于对象状态的方法,并且您应该自己处理该过程<代码>[myVar release],myVar=nil就足够了

如果你想了解更多信息,请阅读戴夫·德隆对问题的回答


对于初始化,调用属性setter和getter也是不好的(原因与上面的基本相同)。在
-init
调用中,您可以将上述变量设置为:

myVar = nil; // If you want to set it up as nil.
OR
myVar = [[NSObject alloc] init]; // Or set it up as an actual object.

在类处于未确定状态的情况下,避免使用
self.myVar=nil
self.myVar=[[NSObject alloc]init
(这些调用在
-viewDidLoad
-awakeFromNib
中都很好,因为到那时,类已经完全初始化,并且可以依赖实例变量处于完整状态).

如果您仅通过属性访问器访问值,只需将属性设置为
nil
,它就会释放


请确保在
dealloc
期间将所有属性设置为
nil

我仍然感到困惑,或者我可能对问题的措辞不正确。我的意思是说,我的实例变量上是否设置了retain属性。我将更新问题以反映这一点。如果您在这里的回答与此案例有关,您可以laborate?我的理解是,一个带有retain属性的var在设置为“=”时会保留一个对象,然后当我设置为=nil时,它会释放该对象。这就是我在这里询问的情况。我已经更新了我的解释。如果仍然不清楚,请告诉我,我会添加到其中。我想我理解你的解释。那么是否批准使用视图控制器,在viewDidLoad方法中使用retain属性“=nil”设置已清理的变量,但在dealoc中使用[var release]。(这是我在其示例(如ToolbarSearch示例)中观察到的。)在
-viewDidLoad
方法中,可以使用属性setter和getter,因为此时类已完全初始化。但是,在
-init
调用期间这样做不是一个好主意,原因与
dealloc
调用相同。我已更新了答案。如果您真的很懒,则有一个Three20宏用于执行此操作他释放/nil步骤…如果你没有使用Three20,那么只需编写你自己的宏就可以了。#安全地定义TT释放(uu POINTER){[u POINTER release];u POINTER=nil;}嘿,乔伊,如果我已经回答了你的问题,别忘了把我的答案标记为正确答案!)