假设我有一个名为“foo”的对象,另一个名为“bar”的对象作为属性。
当“foo”解除分配时,是否会自动删除对“bar”的所有引用,以便“bar”也可以解除分配?或者“foo”deallocate和“bar”漂浮在某个地方的记忆中?即使所有“bar”的引用都在“foo”中定义。
提前感谢。
答案 0 :(得分: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),所以你必须监视你的引用计数和反对自己。
答案 1 :(得分:2)
如果你分配内存,你必须释放它。所以,是的,在[bar release]
中拨打self.bar = nil
或dealloc
(如果您使用的是综合属性等)。
See here介绍iOS上的内存管理。
答案 2 :(得分:0)
对象A负责在解除分配时释放对其他对象(对象B,对象C等)的任何引用 - 这不会自动发生。
这是在对象的-dealloc
方法中完成的:
- (void)dealloc
{
[propertyB release];
[propertyC release];
[super dealloc];
}
(或者如果属性是读/写并且生成为retain
,则可以替换[self setPropertyB:nil]
等。
所以会发生的是,当对对象A的所有引用都消失时,它会被释放,从而减少属性B和C的引用计数。如果这些对象仅由对象A拥有,它们也将最终因此被解除分配。
(对于您标记的所有iPhone OS开发都是如此。我假设您不是在谈论Mac上的垃圾收集环境,它具有不同的规则和行为,并且会自动执行某些操作。)< / p>
答案 3 :(得分:0)
使用self.bar = nil
的一个重要原因是,如果bar是对在nib文件中创建的视图的引用。在这种情况下,可以在-(void)viewDidUnload
中包含该行,因为这将使系统在视图被移出时释放该对象。如果视图返回,它将通过nib文件重新加载。但是,这并不能避免需要在'self.bar = nil
中使用[bar release]
或-(void) dealloc