Objective c ObjC:我可以使用property=nil而不是self.property=nil来释放它吗?

Objective c ObjC:我可以使用property=nil而不是self.property=nil来释放它吗?,objective-c,properties,release,dealloc,Objective C,Properties,Release,Dealloc,我在.h文件中有属性,并在.m文件中合成,我知道我可以使用以下方法释放它: self.property = nil; 但我可以使用: property = nil; 相反 谢谢 否。这是因为使用保留选项生成的@合成方法(或强,如果使用ARC)实际上看起来像这样: - (void)setValue:(NSString *)newValue { [value autorelease]; value = [newValue retain]; } 因此,当您执行self.prope

我在.h文件中有属性,并在.m文件中合成,我知道我可以使用以下方法释放它:

self.property = nil;
但我可以使用:

property = nil;
相反


谢谢

否。这是因为使用
保留
选项生成的
@合成
方法(或
,如果使用ARC)实际上看起来像这样:

- (void)setValue:(NSString *)newValue {
    [value autorelease];
    value = [newValue retain];
}
因此,当您执行
self.property=nil
时,旧值将被自动删除,而
nil
将被保留,这根本不起任何作用

如果只执行
iVar=nil
,则不会释放先前包含的变量对象,因此会泄漏


当然,如果您使用的是ARC(自动引用计数),您不必担心这些。编译器将为您完成这项工作。在这种情况下,
iVar=nil
将具有与
self.iVar=nil
完全相同的效果,尽管有些人可能认为它不太清晰。

否。这是因为使用
保留
选项生成的
@合成
方法(或
strong
,如果您使用ARC)实际上看起来像这样:

- (void)setValue:(NSString *)newValue {
    [value autorelease];
    value = [newValue retain];
}
因此,当您执行
self.property=nil
时,旧值将被自动删除,而
nil
将被保留,这根本不起任何作用

如果只执行
iVar=nil
,则不会释放先前包含的变量对象,因此会泄漏


当然,如果您使用的是ARC(自动引用计数),您不必担心这些。编译器将为您完成这项工作。在这种情况下,
iVar=nil
将具有与
self.iVar=nil
完全相同的效果,尽管有些人可能认为它不太清晰。

只有在不使用ARC的情况下才是如此。如果您使用的是ARC,那么即使不调用setter方法,对象也会被释放(假设属性/ivar的所有权限定符为
strong
)。不过,在我看来,还是显式地调用setter更好。@Andrew这是一个很好的观点,但由于您不必真正担心ARC中的保留/释放,因此我假设他在本例中使用的是手动引用计数。不过,为了安全起见,我想我还是可以对其进行编辑。在不使用属性访问器的情况下,将ivar设置为nil是可行的,但却否定了拥有属性的一个关键点。如果您正在使用访问器,并且后来决定在更改属性值时需要执行某些操作,则只需向访问器方法添加代码。如果您不使用访问器并希望这样做,则必须查找每个直接接触ivar的地方。@rickster是和否。使用属性还有其他好处,主要是自动合成的getter和setter。尽管如此,我完全同意你的观点,但这不是问题的重点。它只处理将它们设置为
nil
以释放它们。这仅在不使用ARC时才适用。如果您使用的是ARC,那么即使不调用setter方法,对象也会被释放(假设属性/ivar的所有权限定符为
strong
)。不过,在我看来,还是显式地调用setter更好。@Andrew这是一个很好的观点,但由于您不必真正担心ARC中的保留/释放,因此我假设他在本例中使用的是手动引用计数。不过,为了安全起见,我想我还是可以对其进行编辑。在不使用属性访问器的情况下,将ivar设置为nil是可行的,但却否定了拥有属性的一个关键点。如果您正在使用访问器,并且后来决定在更改属性值时需要执行某些操作,则只需向访问器方法添加代码。如果您不使用访问器并希望这样做,则必须查找每个直接接触ivar的地方。@rickster是和否。使用属性还有其他好处,主要是自动合成的getter和setter。尽管如此,我完全同意你的观点,但这不是问题的重点。它只处理将它们设置为
nil
以释放它们。