5

比方说,我有一个名为“foo”的对象与另一个名为“bar”的对象作为属性。Objective-C:你是否必须在释放父对象之前释放属性对象?

当“foo”释放时,它是否会自动删除对“bar”的所有引用,以便“bar”也可以解除分配?或将“富”解除分配和“酒吧”浮在内存的某个地方?即使所有“酒吧”的引用都在“foo”中定义。

在此先感谢。

回答

15

如果foo对象有任何保留或(感谢大卫)bar的副本,例如当你财产申报作为两者之一:

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

你需要释放你bar时取消分配foo

- (void)dealloc 
{ 
    [bar release]; 

    [super dealloc]; 
} 

会为你不自由bar的内存空间,直到您摆脱所有引用(即引用计数下降到0)的系统,所以你必须自己监视你的引用计数和对象。

+2

+1如果该属性声明为'copy',则还必须释放+1。 – 2010-07-15 15:35:07

2

如果你分配内存,你必须释放它。所以,是的,在dealloc中拨打[bar release]self.bar = nil(如果您使用的是综合属性等)。

See here用于iOS上的内存管理介绍。

+1

'bar = nil'不会削减它,您需要使用'self.bar = nil'或'[self setBar:无]'实际释放目标对象。然而,在'-dealloc'中调用'self'的方法是个坏主意,所以请改为调用'[bar release]'。 – 2010-07-15 15:14:41

+0

对不起,你说得对,'self.bar = nil'。苹果文档和示例代码通常会提供'self.prop = nil' ...但我基本同意。 – rfunduk 2010-07-15 15:16:17

0

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

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

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

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

所以会发生的是,当对象A的所有引用都消失时,它将被释放,从而减少属性B和C的引用计数。如果这些对象仅由对象A拥有,它们也会结束结果被解除分配。 (这在你标记的所有iPhone OS开发中都是这样,我假设你不是在谈论Mac上的垃圾回收环境,它有不同的规则和行为,并且会自动做一些事情。)

0

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