Если функция создает и возвращает объект, должен ли он быть в пуле автоматического выпуска - PullRequest
2 голосов
/ 22 января 2011

Я все еще довольно плохо знаком с целью-c.

Насколько я понимаю, любой объект, который я не получаю из alloc, new, copy или mutableCopy, следует считать находящимся в пуле автоматического выпуска.

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

Например, у меня есть функция, которая анализирует xml и возвращает объект, представляющийданные в xml, этот объект должен находиться в пуле автоматического выпуска перед возвратом.

Моя главная задача - разработка iPhone, но общий ответ был бы признателен.

Ответы [ 3 ]

3 голосов
/ 23 января 2011

Вы можете сделать это обоими способами: либо вернуть объект, который принадлежит вызывающей стороне, либо вернуть объект, который не принадлежит вызывающей стороне (например, объект с автоматическим выпуском).Независимо от выбранной вами стратегии, следуйте соглашениям об именах.Например,

- (NSString *)fullNameCopy {
    return [[NSString alloc] initWithFormat:@"%@ %@", self.firstName, self.LastName];
}

возвращает объект NSString, который принадлежит вызывающей стороне.Имя метода - fullNameCopy, что соответствует правилам именования: метод, содержащий в своем имени «copy», возвращает объект, принадлежащий вызывающей стороне.Возвращаемое значение не помещается в пул автоматического выпуска.

В качестве альтернативы,

- (NSString *)fullName {
    return [NSString stringWithFormat:@"%@ %@", self.firstName, self.LastName];
}

или

- (NSString *)fullName {
    NSString *s = [[NSString alloc] initWithFormat:@"%@ %@", self.firstName, self.LastName];
    return [s autorelease];
}

возвращает строку, которая не принадлежит вызывающей стороне, иимя метода не содержит alloc, new или copy.Возвращаемое значение автоматически высвобождается, поэтому оно будет освобождено, когда соответствующий пул автоматического высвобождения истощается, если вызывающая сторона явно не решит его сохранить.

При этом в вашем конкретном сценарии вторая стратегия - возвращение объекта,не принадлежит звонящему - выглядит как лучшее решение.Вызывающий объект, скорее всего, либо немедленно обработает объект (поэтому он не будет заинтересован в владении объектом), либо оставит его в свойстве (которое, скорее всего, будет либо копировать, либо сохранять свойство).

2 голосов
/ 22 января 2011

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

return [newObject autorelease];

(edit)

0 голосов
/ 22 января 2011
  1. Вы должны прочитать Руководство по управлению памятью Objective-C .
  2. Любой объект, возвращенный методом new, alloc или copy, принадлежит вам. Вы владеете им, и вы должны освободить его.
  3. Любой объект, возвращенный любым другим методом, находится в пуле автоматического выпуска. Если вы хотите сохранить объект за пределами вашей текущей области видимости, вы должны сохранить его.

Пример XML, вероятно, верен: если вы возвращаете объект из метода и имя этого метода не содержит new или copy в имени, которое вы должны, по соглашению, вернуть автоматически освобожденный объект.

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