释放一个对象但仍然可以使用它

Posted

技术标签:

【中文标题】释放一个对象但仍然可以使用它【英文标题】:Releasing an object but still able to use it 【发布时间】:2010-11-06 05:18:41 【问题描述】:

我知道一旦你释放了一个对象,你就不应该使用它,因为它已经不在内存中了,它会导致错误。

但是通过this Apple指南阅读,我找到了这段代码,并且之前也看到过,但我只是将[object release]移动到我的代码末尾,以免出错。但似乎它被接受并且有效。那么,为什么会这样呢?发布后如何继续设置变量为dateAttribute

(第 3 行是有问题的):

NSMutableArray *runProperties = [NSMutableArray array];

NSAttributeDescription *dateAttribute = [[NSAttributeDescription alloc] init];
[runProperties addObject:dateAttribute];
[dateAttribute release];
[dateAttribute setName:@"date"];
[dateAttribute setAttributeType:NSDateAttributeType];
[dateAttribute setOptional:NO];

从这里得到它:Creating a managed object model in code

【问题讨论】:

【参考方案1】:

有几点我们应该讨论。

    release 总是使对象被释放。该对象将仅在“最后一次”释放时被释放,即当保留计数降至零时。 尽管如此,在释放对象后您不应该使用它仍然是正确的,因为它可能已经被释放了。 NSMutableArray 将保留对象,直到它从数组中删除,或者数组本身被分配。

该示例利用了数组在添加时将retain引用,因此在释放dateAttribute后引用不会被释放。然而,这不是一个好的风格,因为它的有效性仅取决于类NSMutableArray 本身的性质,并且它违反了我们不应该使用发布引用的常见规则。

【讨论】:

已编辑删除对retainCount 的引用。下降到 0 的概念是有效的,但 retainCount 出于显而易见的原因永远无法真正返回 0。 编译器是否将dateAttribute更改为内存地址?因为对我来说,即使数组在对象上创建了另一个retain,它仍然是两个不同的指针(一个称为 dateAttribute,另一个称为 runProperties[0])。所以,如果我释放dateAttribute,我想我正在释放指向该对象的指针,而使用该对象的唯一方法是[[runProperties objectAtIndex:0] setSomething:blah]; 不,释放后dateAttribute会指向同一个地址,不管释放是否导致释放。【参考方案2】:

从技术上讲,这是一种糟糕的风格,但它确实有效。

NSMutableArray(runProperties addObject)在 dateAttribute 上调用 retain。所以调用release不会破坏dateAttribute(还有一个引用)。

出于可读性和重构原因,我还将调用releaselast

【讨论】:

以上是关于释放一个对象但仍然可以使用它的主要内容,如果未能解决你的问题,请参考以下文章

释放的分配内存仍然可以访问[重复]

自动释放池

当代码无法释放内存时,它是不是是 C 中的内存泄漏,但操作系统仍然会?

我应该在重新分配之前调用分配给保留属性的自动释放对象的释放吗?

对象被释放了,它们仍然给出了它们的值。 ARC 未标记(表示关闭)

为啥在释放指向它的指针后仍然可以访问结构的成员?