Правильный способ создания экземпляра NSDictionary / NSArray в init без дополнительных сохранений - PullRequest
0 голосов
/ 02 сентября 2010

У меня есть множество классов, которые используют различные классы коллекций NSDictionary / NSArray в качестве ivars, но часто я сталкиваюсь с проблемой освобождения моего класса коллекции до выпуска содержащего класса.

Похоже, это происходит в основном с классами коллекций, а не с другим классом модели (т. Е. Классами, которые я либо создал отдельно, либо с другими классами NS *, не относящимися к коллекции).

Вот два варианта, которые я сделал и видел, что другие люди делают: @implementation ClassX

// myDictionary declared as a property in the .h file as this:
// @property (nonatomic, retain) NSMutableDictionary *myDictionary;

@synthesize myDictionary;

- (id)int
{
    if (self = [super init])
    {
        // Option 1:
        // If I don't instantiate and assign with 'self',
        // myDictionary ivar will not be available 
        // at times in doSomething.

        myDictionary = [NSMutableDictionary dictionary];

        // Option 2:
        // Doing this, however will keep the dictionary around.
        // because I have invoked an extra retain on the dictionary
        self.myDictionary = [NSMutableDictionary dictionary];

        // Which one is more correct?   
    }
    return self;
}

- (void)doSomething
{
    // this will give the error about trying to invoke
    // a method on an already released instance
    [myDictionary objectForKey:@"myKey"];
}

- (void)dealloc
{
    // If I did self.myDictionary in 'init', I then
    // need to do this:
    [myDictionary release];
    [super dealloc];
}
@end

Итак, какой подход является более правильным способом хранения экземпляра NSDictionary внутри класса?

Ответы [ 2 ]

2 голосов
/ 02 сентября 2010

Вариант 2 правильный;Вариант 1 неверен.

Но вы оставили лучший вариант: myDictionary = [[NSMutableDictionary alloc] init].

1 голос
/ 02 сентября 2010

Я рекомендую использовать

myDictionary = [[NSMutableDictionary alloc] init];

Память находится внутри области действия метода, в котором вы находитесь, если вы вызываете [словарь NSMutableDictionary]. Когда вы покидаете метод, эта память уходит вместе с ним, поэтому вам нужно выделить / init, если вы хотите сохранить значения.

Вот почему вам не нужно выпускать, если вы не сталкиваетесь с выделением.

Так, например:

- (void) doSomething {

  // Do not need to release this string
  NSString *someText = @"Hello world!";

  // You need to release this string:
  NSString *otherText = [[NSString alloc] initWithString:@"Hello world!"];

  [otherText release];
}

Отредактировано: Я удалил себя после @mipadi @ st3fan и поймал мою ошибку. Забыл опубликовать изменения. Спасибо за то, что заставили меня отчитаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...