使用@property和@synthesize时防止泄漏

时间:2011-08-28 08:59:43

标签: objective-c memory-management memory-leaks properties

在使用@property@synthesize时,我们应该采取哪些步骤(最佳做法)来防止泄漏?

2 个答案:

答案 0 :(得分:3)

请注意您的标准内容,它们会为您提供保留的对象,使用alloc,copy或new的方法。当您与属性一起调用它们时,可能会无意中造成泄漏。

在你的界面中有

@property (nonatomic, retain) NSArray *someArray;

在您的实施中,您有

@synthesize someArray;

然后你使用属性

self.someArray = [[NSArray alloc] init];

你的对象现在有一个保留计数为2.一个来自self.someArray =和一个来自alloc。 self.someArray =调用你的setter,它与 - (void)setSomeArray相同:(NSArray)someArray;这是通过合成为您创建的。由于您在@property声明中使用了retain关键字,因此将包含一个retain。

我倾向于避免这两种方式之一。

使用自动释放的初始化程序

self.someArray = [NSArray array];

self.someArray = [[[NSArray alloc] init] autorelease];

或使用临时变量

NSArray tempArray = [[NSArray alloc] init];
self.someArray = tempArray;
[tempArray release];

所有这些方法都会让你的self.someArray对象的保留计数为1,你可以在dealloc中处理它。

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

答案 1 :(得分:0)

对我有很大帮助的一件事是检查头文件中是否有保留类型的属性定义,然后确保-dealloc方法中每个属性都有一个版本。

对于对象生命周期内属性的各种赋值,自动合成的setter应该处理它。