Предупреждение анализатора о неправильном уменьшении количества ссылок - PullRequest
1 голос
/ 10 ноября 2011

Я только что установил Xcode 4 и открыл более раннюю версию своего приложения. Анализатор сообщает об этой строке:

[self.myViewControllerObject release];

неверное уменьшение счетчика ссылок объекта, который в данный момент не принадлежит вызывающей стороне

Я не включил ARC для моего проекта.

Когда я анализирую v2.0 моего приложения в Xcode 3.2.5, оно не показывает никакой потенциальной ошибки.

Заголовок:

        @class MyViewController;

        MyViewController *myViewControllerObject;

        @property ( nonatomic , retain )  MyViewController *myViewControllerObject; 

Реализация:

        #import "MyViewController.h"

        @synthesize myViewControllerObject;

При нажатии кнопки у меня есть:

TRY 1:

self.myViewControllerObject = [[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil]; 

[self.navigationController pushViewController:self.myViewControllerObject animated:YES];


[self.myViewControllerObject release];

TRY 2:

MyViewController *temp = [[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil];  

self.myViewControllerObject = temp;

[temp release];

[self.navigationController pushViewController:self.myViewControllerObject animated:YES];


[self.myViewControllerObject release];

TRY 3:

self.myViewControllerObject = [[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil]; 

[self.navigationController pushViewController:self.myViewControllerObject animated:YES];

В методе dealloc я освобождаю его:

[self.myViewControllerObject release];

Ответы [ 3 ]

3 голосов
/ 10 ноября 2011

Предупреждение приходит от того, что вы вызываете release для свойства через метод доступа: когда вы делаете [self.myViewControllerObject release], вы фактически вызываете метод доступа myViewControllerObject, а затем release для возвращаемого значения.Поскольку имя метода не начинается с new, copy или mutableCopy, вы не владеете объектом, который он возвращает, следовательно, вам не «разрешено» release его.

Решение состоит в том, чтобы никогда не вызывать release для возвращаемого значения этого метода доступа, поэтому в основном ваша попытка # 2 была в порядке:

MyViewController *temp = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];  
self.myViewControllerObject = temp;
[self.navigationController pushViewController:temp animated:YES];
[temp release];

Но в dealloc не используйтедля доступа, скорее:

[myViewControllerObject release];

Если вам нужно release myViewController , отличное от dealloc, присвойте nil через установщик:

self.myViewControllerObject = nil;

Редактировать : Подробнее об этом см. Расширенное руководство по управлению памятью Apple .

0 голосов
/ 11 июля 2014

Когда я использовал версию XCode 4 Beta , возникла проблема.Но когда я попробовал его в версии XCode 4 , предупреждение Analyzer мне не пришло в голову.Я благодарю всех, кто участвовал, чтобы помочь мне. Спасибо за ваше время.

0 голосов
/ 10 ноября 2011

Контроллер навигации управляет жизненным циклом контроллеров представления, которые вы добавляете к нему.Таким образом, когда вы нажимаете контроллер представления, вы передаете «владение».Тем не менее, нет причин, по которым вы не можете также поддерживать ссылку на контроллер представления.Попробуйте следующий порядок:

    self.myViewControllerObject = [[MyViewController alloc]initWithNibName:@"MyViewController" bundle:nil]; 

    [self.myViewControllerObject release];

    [self.navigationController pushViewController:self.myViewControllerObject animated:YES];

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

...