Какой из этих методов управления памятью лучше в каких ситуациях? - PullRequest
4 голосов
/ 09 января 2011

Apple Руководство по программированию управления памятью показывает три официально санкционированных метода для написания методов доступа, которые должны сохранять или освобождать ссылки на объекты.

В случае первых двух методов (воспроизведенных ниже)В документации Apple говорится, что «[t] производительность метода 2 значительно лучше, чем методика 1 в ситуациях, когда геттер вызывается гораздо чаще, чем сеттер».

// Technique 1
- (NSString*) title
{
    return [[title retain] autorelease];
}

- (void) setTitle: (NSString*) newTitle
{
    if (title != newTitle)
    {
        [title release];
        title = [newTitle retain]; // Or copy, depending on your needs.
    }
}

// Technique 2
- (NSString*) title
{
    return title;
}

- (void) setTitle: (NSString*) newTitle
{
    [title autorelease];
    title = [newTitle retain]; // Or copy, depending on your needs.
}

Это единственное отличие?между техникой 1 и техникой 2, или использование одного над другим имеет другие тонкие последствия, о которых мне, возможно, нужно знать?И если в методике 2 используется более эффективный метод получения, следует ли из этого, что в методике 1 используется более эффективный метод установки, поскольку title получает явный (и предположительно немедленный) выпуск?

Ответы [ 2 ]

1 голос
/ 10 января 2011

Получатель от 2 и Установщик от 1:

- (NSString*) title
{
    return title;
}

- (void) setTitle: (NSString*) newTitle
{
    if (title != newTitle)
    {
        [title release];
        title = [newTitle retain]; // Or copy, depending on your needs.
    }
}
0 голосов
/ 09 января 2011

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

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

...