比方说,我有一个名为“foo”的对象与另一个名为“bar”的对象作为属性。Objective-C:你是否必须在释放父对象之前释放属性对象?
当“foo”释放时,它是否会自动删除对“bar”的所有引用,以便“bar”也可以解除分配?或将“富”解除分配和“酒吧”浮在内存的某个地方?即使所有“酒吧”的引用都在“foo”中定义。
在此先感谢。
比方说,我有一个名为“foo”的对象与另一个名为“bar”的对象作为属性。Objective-C:你是否必须在释放父对象之前释放属性对象?
当“foo”释放时,它是否会自动删除对“bar”的所有引用,以便“bar”也可以解除分配?或将“富”解除分配和“酒吧”浮在内存的某个地方?即使所有“酒吧”的引用都在“foo”中定义。
在此先感谢。
如果foo
对象有任何保留或(感谢大卫)bar
的副本,例如当你财产申报作为两者之一:
@property (nonatomic, retain) NSString *bar;
// Or
@property (nonatomic, copy) NSString *bar;
你需要释放你bar
时取消分配foo
:
- (void)dealloc
{
[bar release];
[super dealloc];
}
会为你不自由bar
的内存空间,直到您摆脱所有引用(即引用计数下降到0)的系统,所以你必须自己监视你的引用计数和对象。
如果你分配内存,你必须释放它。所以,是的,在dealloc
中拨打[bar release]
或self.bar = nil
(如果您使用的是综合属性等)。
See here用于iOS上的内存管理介绍。
'bar = nil'不会削减它,您需要使用'self.bar = nil'或'[self setBar:无]'实际释放目标对象。然而,在'-dealloc'中调用'self'的方法是个坏主意,所以请改为调用'[bar release]'。 – 2010-07-15 15:14:41
对不起,你说得对,'self.bar = nil'。苹果文档和示例代码通常会提供'self.prop = nil' ...但我基本同意。 – rfunduk 2010-07-15 15:16:17
对象A负责在释放对其他对象(对象B,对象C等)的任何引用 - 这不会自动发生。
这是在对象上的-dealloc
方法完成:
- (void)dealloc
{
[propertyB release];
[propertyC release];
[super dealloc];
}
(或者如果属性是读/写,并如maked retain
,可以替代[self setPropertyB:nil]
等)。
所以会发生的是,当对象A的所有引用都消失时,它将被释放,从而减少属性B和C的引用计数。如果这些对象仅由对象A拥有,它们也会结束结果被解除分配。 (这在你标记的所有iPhone OS开发中都是这样,我假设你不是在谈论Mac上的垃圾回收环境,它有不同的规则和行为,并且会自动做一些事情。)
使用self.bar = nil
的主要原因是,如果bar是对在nib文件内创建的视图的引用。在这种情况下,可以在-(void)viewDidUnload
中包含该行,因为这会让系统在视图被洗出时释放该对象。如果视图返回,它将通过nib文件重新加载。但是,这并不能避免需要使用'self.bar = nil
或[bar release]
-(void) dealloc
+1如果该属性声明为'copy',则还必须释放+1。 – 2010-07-15 15:35:07