Это хорошая идея сохранить объект самообслуживания с распределением - PullRequest
2 голосов
/ 10 января 2012

Я делаю некоторое распределение как

self.xyz = [[NSDictionary alloc] init];

Это хорошая идея сохранить такое свойство? Или

будет лучше сделать такие как:

NSDictionary *zzz = [[NSDictionary alloc] init];
self.xyz = zzz;
[zzz release];

Мое беспокойство здесь заключается в том, что я видел некоторые места, где люди хранят такие, как:

self.xyz = [[NSDictionary alloc] init];

, что означает, что счетчик удержания равен 2. Так каков наилучший способ уменьшить счет до одного.

Спасибо. Просто пытаюсь прояснить некоторую концепцию управления памятью. Еще немного.

Ответы [ 7 ]

3 голосов
/ 10 января 2012

Это зависит от того, как вы обработали свойство xyz.Если вы сделали

@property (nonatomic, retain) NSObject *xyz;

, то xyz имеет удержание на NSDictionary, поэтому вторая (3-строчная) версия лучше.

2 голосов
/ 10 января 2012

Я предполагаю, что мы говорим о лучших практиках, когда НЕ используем ARC.

В среде ручного управления памятью первый подход неверен, потому что, как вы указали, счет сохранения равен 2. Правильный способ сделать один вкладыш выглядит так:

self.xyz = [[[NSDictionary alloc] init] autorelease];

Проходя через синтезированный установщик (при условии, что xyz объявлено с помощью директивы retain), добавляет 1 к счету сохранения в дополнение к 1, добавляемому alloc / init. Авто-релиз есть, чтобы сбалансировать это.

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

2 голосов
/ 10 января 2012

Я обычно делал бы это:

self.xyz = [[[NSDictionary alloc] init] autorelease];

Или, если у класса есть метод удобства, используйте его так:

self.xyz = [NSDictionary dictionary];

Или просто используйте ARC, и пусть он сделает всю работу за вас в этом случае.

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

Я думаю, что вы должны использовать autorelease в качестве лучшей практики для своего кода.

0 голосов
/ 09 июля 2012

Второй подход - лучший способ сохранить счет как 1.

0 голосов
/ 10 января 2012

Вы всегда должны сбалансировать уравнение управления памятью, в противном случае возможны утечки памяти.

В вашем примере это зависит от политики управления памятью xyz.

Если у xyz есть сохранениеполитика, у вас есть счет отсчета двух.Это распространенная ошибка, и у вас есть утечка памяти.

@property (retain, nonatomic) SomeClass* xyz;

Если у xyz есть политика назначения, вы не увеличиваете счет сохранения

@property (assign, nonatomic) SomeClass* xyz;

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

- (void)dealloc
{
   [xyz release];     
   [super dealloc];
}

Надеюсь, это поможет.

0 голосов
/ 10 января 2012

По моему скромному мнению,

self.xyz = [NSDictionary alloc]

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

Вы можете сделать это

xyz = [NSDictionary alloc]

После этого даже у меня тот же вопрос. Какой подход лучше? а почему?

...