Освобождение объектов, созданных функциями - PullRequest
0 голосов
/ 10 августа 2011

Я изучаю obj-c и у меня есть вопрос об управлении памятью:

Скажем, у меня есть функция, которая возвращает NSDictionary, "fDictionary",

NSDictionary *fDictionary {
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                              [NSNumber numberWithInt:1], @"blah",nil];
return dict
} 

, который вызывается определенным методом:

-(int)fNumber {
  NSDictionary *f = fDictionary();
  return [[f objectForKey:@"blah"] intValue];
}

Что мне неясно, так это то, как / где я должен выпускать объект NSDictionary.

Должен ли я выпустить его в методе или автоматически выпустить его в функции?

Ответы [ 5 ]

3 голосов
/ 10 августа 2011

Если функция была написана правильно, словарь автоматически высвобождается, поэтому вам не нужно его вообще выпускать.Скоро он будет выпущен пулом авто-релизов.

Вы выпускаете только то, что сохраняете или копируете сами.Это те вещи, которые вы "владеете".Будьте уверены, чтобы не выпустить их слишком рано.Обычно точка находится перед концом функции, в которой они размещены или сохранены, если они локальные.Если они являются иварами, то, как правило, лучшая точка - это деллок класса, к которому относится ивар.

1 голос
/ 10 августа 2011

Общее правило: если ваш код выделяет что-то, вам нужно его разблокировать или автоматически разблокировать.

Если бы это была чужая функция, вы могли бы ожидать, что возвращаемый словарь был автоматически выпущен - что является здесь соглашением. Я хотел бы убедиться, что fDictionary возвращает автоматически выпущенный NSDictionary.

1 голос
/ 10 августа 2011

Не зная ничего о fDictionary, трудно быть уверенным, но в большинстве кодов Object C соблюдаются следующие правила:

  • Вы владеете им, если экземпляр был создан с alloc или copy
  • Вы владеете им, если вы retain оно
  • В противном случае оно вам не принадлежит

Если вы не владеете им, выне должен release it.

Таким образом, по соглашению, функция будет возвращать объект autorelease d, и вам не потребуется никакого дополнительного управления в вашем методе.

0 голосов
/ 15 августа 2011

номер

NSDictionary dictionaryWithObjectsAndKeys: (что на самом деле просто [[[NSDictonary alloc]initWithObjectsAndKeys:, nil]autorelease]) возвращает автоматически выпущенный NSDictionary. Это означает, что словарь будет автоматически выпущен, когда компьютер решит, что он больше не нужен.

Если бы в fDictionary() словаре было alloc ed, вам нужно было бы выпустить его вручную. Это практическое правило всегда возвращать автоматически освобожденные объекты из функций / методов, поэтому пользователю функций / методов не нужно беспокоиться об управлении памятью.

0 голосов
/ 14 августа 2011

Если вы получили объект от метода, имя которого начинается с «alloc», «new», «copy» или «mutableCopy», вы должны разблокировать или автоматически разблокировать его.В противном случае оно уже автоматически выпущено.

Если вы что-то сохранили, вы должны освободить его, больше ничего для вас не будет.

Каждый программист Obj-C должен прочитать Управление памятьюРуководство .

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