Утечка памяти - установка переменной в init? - PullRequest
1 голос
/ 09 июля 2011

Управление памятью снова запутало меня -

В моем .h файле у меня есть:

@property (nonatomic,retain) NSMutableDictionary *properties;

В моем .m у меня есть следующий метод init, который жалуется наутечка в инструментах в строке self.properties:

- (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 ]

6 голосов
/ 09 июля 2011

Если ваш .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]];

Те 2 метода, которые для вас синтезированы, будут выглядеть примерно так:

- (NSMutableDictionary *)properties {
    return properties;
}

- (void)setProperties:(NSMutableDictionary *)aProperties {
    [aProperties retain];
    [properties release];
    properties = aProperties;
}
1 голос
/ 09 июля 2011

Если у вас есть @property(retain), тогда вам не следует просто alloc, а затем использовать аксессор, потому что вы чрезмерно сохранили объект.Или отпустите его после того, как вы установили свойство, или сначала автоматически выпустите его.

...