5

假设我有一个名为“foo”的对象,另一个名为“bar”的对象作为属性。

当“foo”解除分配时,它会自动删除对“bar”的所有引用,以便“bar”也解除分配吗?或者“foo”会被释放,“bar”会漂浮在内存中的某个地方吗?即使所有“bar”的引用都在“foo”中定义。

提前致谢。

4

4 回答 4

15

如果foo对象有任何保留或副本(感谢 Dave)bar,例如,当您将属性声明为以下任一时:

@property (nonatomic, retain) NSString *bar;
// Or
@property (nonatomic, copy) NSString *bar;

释放bar时需要释放foo

- (void)dealloc
{
    [bar release];

    [super dealloc];
}

系统不会bar为您释放 的内存空间,直到您摆脱对它的所有引用(即引用计数降至 0),因此您必须自己监控引用计数和对象。

于 2010-07-15T15:11:52.017 回答
2

如果分配内存,则必须释放它。所以,是的,[bar release]self.bar = nil你的dealloc.

有关 iOS 内存管理的介绍,请参见此处

于 2010-07-15T15:10:31.473 回答
0

对象 A 在被释放时负责释放对其他对象(对象 B、对象 C 等)的任何引用——这不会自动发生。

这是在-dealloc对象的方法中完成的:

- (void)dealloc 
{
    [propertyB release];
    [propertyC release];
    [super dealloc];
}

(或者,如果属性是读/写并设为retain,您可以替换[self setPropertyB:nil]等)。

所以将会发生的是,当对对象 A 的所有引用都消失时,它会被释放,从而减少属性 B 和 C 的引用计数。如果这些对象仅由对象 A 拥有,那么它们最终也会被释放为结果。

(您标记的所有 iPhone OS 开发都是如此。我假设您不是在谈论 Mac 上的垃圾收集环境,它具有不同的规则和行为,并且会自动执行某些操作。)

于 2010-07-15T15:12:34.313 回答
0

使用 bar 的主要原因self.bar = nil是,如果 bar 是对在 nib 文件中创建的视图的引用。在这种情况下,可以将该行包含在 中-(void)viewDidUnload,因为这将使系统在视图被洗牌时释放该对象。如果视图返回,它将通过 nib 文件重新加载。然而,这并不能避免人们需要使用'self.bar = nil[bar release]-(void) dealloc

于 2010-07-15T20:47:47.297 回答