Iphone 目标C:在解除分配父对象之前,是否必须解除分配属性对象?
假设我有一个名为“foo”的对象,另一个名为“bar”的对象作为属性 当“foo”解除分配时,它会自动删除对“bar”的所有引用,以便“bar”也解除分配吗?或者“foo”释放和“bar”是否会在内存中的某个地方浮动?即使所有“bar”的引用都是在“foo”中定义的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)条上
提前感谢。如果分配内存,则必须释放内存。因此,是的,在
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如果属性声明为复制
,您还必须释放。