内存泄漏 - 在init中设置变量?

时间:2011-07-09 06:29:37

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

内存管理让我感到困惑 -

在我的.h文件中,我有:

@property (nonatomic,retain) NSMutableDictionary *properties;

在我的.m中,我有以下init方法,它抱怨self.properties行中的Instruments泄漏:

- (id) init {
  self = [super init];

  self.properties = [[NSMutableDictionary alloc] init];

  return self;
}

如果我不使用访问器,它也会抱怨泄漏。

同样,如果我使用这个策略,它会泄漏:

NSMutableDictionary *temp = [[NSMutableDictionary alloc] init];

self.properties = temp;

[temp release];

在dealloc我有:

self.properties = nil;
[properties release];

我以为我遵守了这些规则,但这个是暗示我的。

2 个答案:

答案 0 :(得分:6)

如果您的.h定义如下:

@interface MDObject : NSObject {
    NSMutableDictionary *properties;
}

@property (nonatomic, retain) NSMutableDictionary *properties;

@end

以下是您.m的正确实现:

@implementation MDObject

- (id)init {
    if ((self = [super init])) {
         properties = [[NSMutableDictionary alloc] init];
    }
    return self;
}

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

@end

@implementation MDObject

- (id)init {
    if ((self = [super init])) {
         self.properties = [NSMutableDictionary dictionary];
    }
    return self;
}

- (void)dealloc {
    self.properties = nil; // while this works,
                           // [properties release] is usually preferred
    [super dealloc];
}

@end

记住

可能会有所帮助
self.properties = [NSMutableDictionary dictionary];

相同
[self setProperties:[NSMutableDictionary dictionary]];

为您合成的这两种方法看起来类似于以下内容:

- (NSMutableDictionary *)properties {
    return properties;
}

- (void)setProperties:(NSMutableDictionary *)aProperties {
    [aProperties retain];
    [properties release];
    properties = aProperties;
}

答案 1 :(得分:1)

如果你有@property(retain),那么你不应该只是alloc然后使用访问者,因为你已经过度保留了对象。在设置属性后释放它或首先自动释放它。