Сохранение присвоенного свойства переменной экземпляра - PullRequest
0 голосов
/ 18 января 2012

У меня есть свойство, которое имеет (nonatomic, assign) в качестве атрибутов.

В методе тогда я retaining этой переменной, затем releasing это строка после.

Статический анализаторпредупреждает, что incorrect decrement of the reference count of object....

Могу ли я этого не делать

@property (nonatomic, assign) Class *iVar;

            [self.iVar retain];
            [self.iVar removeFromSuperview];
            [self insertSubview:self.iVar atIndex:self.iVar.index];
            [self.iVar release];

Ответы [ 3 ]

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

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

UIView *someView = self.interestingView;
[someView retain];
//...do some stuff...
[someView release];

Это по крайней мере обеспечивает некоторую защиту в случае, есличасть "некоторого материала" может измениться self.interestingView.И это, вероятно, также удовлетворит статический анализатор.

В общем, я бы избегал сохранять / освобождать переменные, которые возвращают свойства за пределами методов доступа для этих свойств, за исключением нескольких четко определенных ситуаций, таких как -dealloc,Аналогично, избегайте непосредственного сохранения / освобождения результата доступа к свойству, как в [self.foo retain].Если это свойство будет изменено до того, как вы перейдете к выпуску, вы получите как утечку, так и, позднее, перевыпуск.

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

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

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

Я только что протестировал подобный пример,

Вы успокоите статический анализатор, не используя нотацию свойств

[iVar retain];
[self.iVar removeFromSuperview];
[self insertSubview:self.iVar atIndex:self.iVar.index];
[iVar release];

Или вы можете использовать временную переменную.

...