【发布时间】:2011-12-07 09:29:50
【问题描述】:
提前谢谢...
所以在最近的一些内存泄漏和错误(记录在here)之后,我一直在研究我的内存管理,我现在正在尝试在我拥有的帮助器类中为 NSDictionary 编写自定义 getter。
自定义getter的原因是:
首先,它是一个计算字典,因此对于性能问题,我想返回缓存的对象,除非需要重新生成它(我下面的示例计算量不是很大,但类中的其他人会这样)。
其次,我想懒惰地实例化。我只想在另一个类“要求”时生成字典,这就是我在 getter 中检查 nil 的原因。
所以,问题。下面的代码代表了我第一次(研究过)编写自定义 setter/getter 的尝试,我通常只是合成。
1) 这是正确的实现和正确的内存管理吗?
2) 这是最好的吗?
3) BOOL installedStandardsChangedSinceLastRead 是标记需要重新计算的最佳方式吗?如果类中的其他方法改变了某些东西,就会发生这种情况。但是我是否应该将这些方法设为 nil out _installedStandards,因为这也会触发重新计算?
4) 最后,如果我 确实 只是让其他方法消除 iVar 以将其标记为重新计算,我将如何确保我不会泄漏?我会使用setter(即self.installedStandards = nil),直接nil iVar(即_installedStandards = nil),还是别的什么?
(哦,如果我直接取消了 iVar,我需要先释放它吗?似乎正确的是 [_installedStandards release]; _installedStandards = nil?在这种情况下我不能只使用 self.installedStandards = nil 吗?)
进入代码! 提醒一下,这是一个更复杂的类的简化版本(请参阅顶部的链接),其中包含许多这些 setter/getter。在充实之前,我需要确保自己执行正确。
.h 文件
@interface InstalledStandardTracker20 : NSObject {
NSDictionary *_installedStandards;
BOOL _installedStandardsChangedSinceLastRead;
}
@property (nonatomic, retain) NSDictionary *installedStandards;
@property (nonatomic) BOOL installedStandardsChangedSinceLastRead;
@end
@implementation
@implementation InstalledStandardTracker20
@synthesize installedStandardsChangedSinceLastRead = _installedStandardsChangedSinceLastRead;
- (void)refreshInstalledStandards {
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
self.installedStandards = [currentDefaults objectForKey:@"installedStandards"];
self.installedStandardsChangedSinceLastRead = NO;
}
- (NSDictionary *)installedStandards {
if (!_installedStandards || self.installedStandardsChangedSinceLastRead) {
[self refreshInstalledStandards];
}
return _installedStandards;
}
- (void)setInstalledStandards:(NSDictionary *)newInstalledStandards {
[newInstalledStandards retain];
[_installedStandards release];
_installedStandards = newInstalledStandards;
}
【问题讨论】:
标签: iphone ios memory-management getter-setter