【发布时间】:2011-11-05 09:42:38
【问题描述】:
在使用@property 和@synthesize 时,我们应该采取哪些步骤(最佳做法是什么)来防止泄漏?
【问题讨论】:
标签: objective-c memory-management memory-leaks properties
在使用@property 和@synthesize 时,我们应该采取哪些步骤(最佳做法是什么)来防止泄漏?
【问题讨论】:
标签: objective-c memory-management memory-leaks properties
请注意您的标准事物会返回保留对象、alloc、copy 或 new 方法。当您将这些与您的属性一起调用时,您可能会无意中造成泄漏。
在你的界面中你有
@property (nonatomic, retain) NSArray *someArray;
在你的实现中你有
@synthesize someArray;
然后你稍后使用该属性
self.someArray = [[NSArray alloc] init];
您的对象现在的保留计数为 2。一个来自使用 self.someArray =,一个来自分配。 self.someArray = 调用与 - (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];
}
【讨论】:
对我有很大帮助的一件事是检查您的头文件中是否存在具有保留类型的属性定义,然后确保在 -dealloc 方法中对它们中的每一个都有一个释放。
对于对象生命周期内的各种属性分配,自动合成设置器应该处理它。
【讨论】: