Ios 将保留属性设置为零是否足够?

Ios 将保留属性设置为零是否足够?,ios,objective-c,Ios,Objective C,我看到一些带有 @property (nonatomic, readwrite, retain) id something; 他们合成了它: @synthesize something = something_; 在构造器中: self.something = @"HELLO!"; 我假设,上面的行有效地保留了该字符串 但是,在他们的dealoc方法中,他们这样做: [self setSomething:nil]; 我想这很好,因为我想象当你将一个属性设置为nil时,旧的值被释放。但是后

我看到一些带有

@property (nonatomic, readwrite, retain) id something;
他们合成了它:

@synthesize something = something_;
在构造器中:

self.something = @"HELLO!";
我假设,上面的行有效地保留了该字符串

但是,在他们的dealoc方法中,他们这样做:

[self setSomething:nil];
我想这很好,因为我想象当你将一个属性设置为nil时,旧的值被释放。但是后来,我注意到他们做的所有其他课程都有类似的内容

[something release];

相反,所以我不再确定。两种方法都正确吗?

简短回答:使用ARC。它会帮你处理这些东西。它不容易出错,并且与手动引用计数一样快

详细回答:

如果使用保留属性,则是,将属性设置为nil是正确的

像这样:

self.something = nil;
这是因为保留属性的setter首先释放旧值,然后保留新值并将其分配给属性的iVar。由于新值为nil,因此retain不执行任何操作

如果在第二个示例中:

[something release];
something
是属性的iVar,如果从对象的dealloc方法的代码之外的任何地方调用该代码,则该代码将导致将来的崩溃。原因是这会释放对象,但不会将iVar归零。稍后,当释放具有something属性的对象时,将激发其dealloc方法。dealloc方法中的代码应尝试释放对象的保留属性。向已解除分配的对象发送释放将导致崩溃

在您的例子中,您是在询问dealloc方法中的代码。在dealloc中,调用
[something release]
并将属性设置为nil会产生释放对象的相同结果。不过,调用setter可能更安全,因为自定义setter有时会有其他带有附加“副作用”的代码。因为您正在编写dealloc方法,所以您应该是类的作者,并且应该注意setter方法中的任何特殊代码

现在,如果
something
是一个实例变量,而不是一个属性,那么正确的做法是

[something release]
something = nil;

编辑于2014年6月5日,讨论dealloc方法中的代码案例。

简短回答:使用ARC。它会帮你处理这些东西。它不容易出错,并且与手动引用计数一样快

详细回答:

如果使用保留属性,则是,将属性设置为nil是正确的

像这样:

self.something = nil;
这是因为保留属性的setter首先释放旧值,然后保留新值并将其分配给属性的iVar。由于新值为nil,因此retain不执行任何操作

如果在第二个示例中:

[something release];
something
是属性的iVar,如果从对象的dealloc方法的代码之外的任何地方调用该代码,则该代码将导致将来的崩溃。原因是这会释放对象,但不会将iVar归零。稍后,当释放具有something属性的对象时,将激发其dealloc方法。dealloc方法中的代码应尝试释放对象的保留属性。向已解除分配的对象发送释放将导致崩溃

在您的例子中,您是在询问dealloc方法中的代码。在dealloc中,调用
[something release]
并将属性设置为nil会产生释放对象的相同结果。不过,调用setter可能更安全,因为自定义setter有时会有其他带有附加“副作用”的代码。因为您正在编写dealloc方法,所以您应该是类的作者,并且应该注意setter方法中的任何特殊代码

现在,如果
something
是一个实例变量,而不是一个属性,那么正确的做法是

[something release]
something = nil;

编辑于2014年6月5日,讨论dealloc方法中的代码案例。

两者都是正确的,
[自我设置:无]会更好,当
某个东西被释放为0时,重新计数然后解除锁定。这可以防止使用
某些东西时与坏的\u EXE发生崩溃

正如mifki所说,如果使用[self-setSomething:nil],将调用setter;所以这取决于您在setter方法中所做的工作,一个好的setter应该关心将值设置为nil,并正确处理该情况,而不是不希望的

即使setter方法implement不能始终设置为nil,更好的发布样式应该是:

[something_ release], something_ = nil;  //this should be safely release always

两者都是正确的,
[self-setSomething:nil]会更好,当
某个东西被释放为0时,重新计数然后解除锁定。这可以防止使用
某些东西时与坏的\u EXE发生崩溃

正如mifki所说,如果使用[self-setSomething:nil],将调用setter;所以这取决于您在setter方法中所做的工作,一个好的setter应该关心将值设置为nil,并正确处理该情况,而不是不希望的

即使setter方法implement不能始终设置为nil,更好的发布样式应该是:

[something_ release], something_ = nil;  //this should be safely release always

最好使用
[something\uu.release]
。这不会导致调用setter,否则可能会导致执行一些在
dealloc

中不希望执行的操作,最好使用
[something\uu.release]
。这不会导致调用setter,否则可能会导致执行一些在
dealloc

中不希望执行的操作。在dealloc中,它将尝试释放其保留的属性。这是错误的。@mifki不,这绝对不是错误的。在手动引用计数中,您必须编写dealloc方法来释放所有保留的属性。如果你不这样做,你就会泄露。哦,我以为你的意思是它会自动释放保留的属性。另外,问题本身是关于
dealloc
,因此在这种特殊情况下,不会再有“稍后,当对象被释放时”。哦,亲爱的。我错过了行动问题中的那一点