Iphone 目标C:在解除分配父对象之前,是否必须解除分配属性对象?

Iphone 目标C:在解除分配父对象之前,是否必须解除分配属性对象?,iphone,objective-c,memory-management,garbage-collection,dealloc,Iphone,Objective C,Memory Management,Garbage Collection,Dealloc,假设我有一个名为“foo”的对象,另一个名为“bar”的对象作为属性 当“foo”解除分配时,它会自动删除对“bar”的所有引用,以便“bar”也解除分配吗?或者“foo”释放和“bar”是否会在内存中的某个地方浮动?即使所有“bar”的引用都是在“foo”中定义的 提前感谢。如果分配内存,则必须释放内存。因此,是的,在dealloc中调用[bar release]或self.bar=nil(如果您使用的是合成属性和所有这些属性) 有关iOS上内存管理的介绍。如果foo对象在(感谢Dave)条上

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

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


提前感谢。

如果分配内存,则必须释放内存。因此,是的,在
dealloc
中调用
[bar release]
self.bar=nil
(如果您使用的是合成属性和所有这些属性)


有关iOS上内存管理的介绍。

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

@property (nonatomic, retain) NSString *bar;
// Or
@property (nonatomic, copy) NSString *bar;
解除分配
foo
时,需要释放
bar

- (void)dealloc
{
    [bar release];

    [super dealloc];
}

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

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

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

- (void)dealloc 
{
    [propertyB release];
    [propertyC release];
    [super dealloc];
}
(或者,如果属性被读/写并设置为
retain
,则可以替换
[self-setPropertyB:nil]
,等等)

因此,当对象A的所有引用都消失时,它将被解除分配,从而减少属性B和C上的引用计数。如果这些对象仅由对象A拥有,那么它们也将最终被解除分配


(你标记的所有iPhone操作系统开发都是如此。我想你不是在谈论Mac上的垃圾收集环境,它有不同的规则和行为,并自动完成一些事情。)

使用
self.bar=nil
的主要原因是,如果bar是对nib文件中创建的视图的引用。在这种情况下,可以在
-(void)viewDidUnload
中包含该行,因为这将允许系统在移出视图时释放该对象。如果视图返回,它将通过nib文件重新加载。然而,这并不能避免在
-(void)dealloc
bar=nil
中使用
'self.bar=nil
[bar release]
来释放目标对象。但是,在
-dealoc
中调用
self
上的方法是一个坏主意,因此请调用
[bar release]
。是的,很抱歉,你是对的,
self.bar=nil
。苹果的文档和示例代码通常是
self.prop=nil
。。。但我基本上同意。+1如果属性声明为
复制
,您还必须释放。