如果我们将指向对象的指针指定为nil会发生什么?

时间:2012-01-23 12:52:24

标签: objective-c

我在几个地方看过这段代码。

XYZ *xyz = [[XYZ alloc] init];

但是在dealloc而不是[xyz release];

人们使用self.xyz = nil;

这不会导致内存泄漏吗?

编辑:我最初写的不是xyz = nil,而是self.xyz = nil, 这是一个财产。

3 个答案:

答案 0 :(得分:3)

是的,那是内存泄漏,但是如果XYZ被声明为属性,例如

@property (nonatomic, retain) XYZ* xyz;

- (void)dealloc
{
    self.xyz = nil;
    [super dealloc];
}

这不是内存泄漏,也许你看到的实际上是这个?

编辑: 然后它不是内存泄漏,原因是,setter是由属性创建的,它将类似于下面的那个

- (void)setXYZ:(XYZ *)newXyz
{
    [xyz release];
    xyz = [newXyz retain];
}

因为newXyz为nil,发送retain to nil什么都不做,而旧的xyz正由setter发布。在这种情况下,内存管理正确

答案 1 :(得分:2)

这取决于项目设置。如果启用了ARC,那么,不,应该没有问题。但是,如果项目没有启用ARC,那么内存泄漏可能会出现一些问题。

答案 2 :(得分:0)

您只能对保留的属性和使用setter(self.propertyToBeReleased=nil[self setProPropertyToBeReleased:nil)执行此操作 因此,如果您指定属性nil,则释放旧属性,并且指针指向nil。

您不应该使用iVars。因为数据刚刚泄漏(数据没有发布,但没有指向它的指针 - >不能再发布了。)