假设我有一个名为“foo”的对象,另一个名为“bar”的对象作为属性。
当“foo”解除分配时,它会自动删除对“bar”的所有引用,以便“bar”也解除分配吗?或者“foo”会被释放,“bar”会漂浮在内存中的某个地方吗?即使所有“bar”的引用都在“foo”中定义。
提前致谢。
假设我有一个名为“foo”的对象,另一个名为“bar”的对象作为属性。
当“foo”解除分配时,它会自动删除对“bar”的所有引用,以便“bar”也解除分配吗?或者“foo”会被释放,“bar”会漂浮在内存中的某个地方吗?即使所有“bar”的引用都在“foo”中定义。
提前致谢。
如果foo
对象有任何保留或副本(感谢 Dave)bar
,例如,当您将属性声明为以下任一时:
@property (nonatomic, retain) NSString *bar;
// Or
@property (nonatomic, copy) NSString *bar;
释放bar
时需要释放foo
:
- (void)dealloc
{
[bar release];
[super dealloc];
}
系统不会bar
为您释放 的内存空间,直到您摆脱对它的所有引用(即引用计数降至 0),因此您必须自己监控引用计数和对象。
如果分配内存,则必须释放它。所以,是的,[bar release]
在self.bar = nil
你的dealloc
.
对象 A 在被释放时负责释放对其他对象(对象 B、对象 C 等)的任何引用——这不会自动发生。
这是在-dealloc
对象的方法中完成的:
- (void)dealloc
{
[propertyB release];
[propertyC release];
[super dealloc];
}
(或者,如果属性是读/写并设为retain
,您可以替换[self setPropertyB:nil]
等)。
所以将会发生的是,当对对象 A 的所有引用都消失时,它会被释放,从而减少属性 B 和 C 的引用计数。如果这些对象仅由对象 A 拥有,那么它们最终也会被释放为结果。
(您标记的所有 iPhone OS 开发都是如此。我假设您不是在谈论 Mac 上的垃圾收集环境,它具有不同的规则和行为,并且会自动执行某些操作。)
使用 bar 的主要原因self.bar = nil
是,如果 bar 是对在 nib 文件中创建的视图的引用。在这种情况下,可以将该行包含在 中-(void)viewDidUnload
,因为这将使系统在视图被洗牌时释放该对象。如果视图返回,它将通过 nib 文件重新加载。然而,这并不能避免人们需要使用'self.bar = nil
或[bar release]
在-(void) dealloc