我应该发布这个属性吗?

时间:2009-10-04 18:58:32

标签: objective-c memory-management

我是一个客观的新手,我在内存管理上遇到了一些问题,我已经阅读了苹果的内存管理政策,但是我需要在这里做一些澄清,这很简单我猜,但我想问你我是不对的:

鉴于此属性:

@interface Test : NSObject {
  NSArray *property1;
}
@property (nonatomic,retain) NSArray* property1;
@end

...

//And its implementation:
@implementation Test
@synthetize property1;
-(id) init {
  if (self=[super init]) {
    self.property1=[[[NSArray alloc] initWithCapacity:5] autorelease];
  }
  return self;
}
-(void) dealloc {
  [super dealloc];
  [property1 release];
}

@end

在init方法中向已分配的对象发出Autorelease消息是对的吗?我在apple的文档中这样做,说开发者应该释放每个分配的对象,然后,我认为,alloc sets retain count到1,然后属性(非原子,保留)加1,所以retain == 2,然后autorelease substracts 1,当调用dealloc方法时,property1被释放并保留count == 0,我是对吗?

3 个答案:

答案 0 :(得分:6)

你的内存管理是正确的,尽管Apple(以及很多其他人)通常建议你不要在初始化方法中使用访问器,因为访问器除了简单地设置一个你的类可能没有设置的实例变量之外,还有副作用。处理。在这种情况下,您不希望自动释放,因为您需要对象的所有权。

答案 1 :(得分:2)

一方注意:在dealloc中,您需要在调用[super dealloc]之前释放属性,因为[super dealloc]最终会释放对象的内存,其中包含包含property1变量的内存,因此在调用[super dealloc]后引用该变量无效。它应该是:

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

答案 2 :(得分:0)

使用属性的一个好处是,您可以封装所有“释放”行为,无论您的属性是设置为保留,复制,分配还是其他任何操作:

self.property1 = nil;

我个人习惯于在dealloc中将所有属性设置为nil(使用self.property,而不仅仅是直接访问成员变量),这样即使我改变了内存管理对成员变量的工作方式,它也能正常工作正确。