Цель C проблема утечки памяти - PullRequest
2 голосов
/ 05 октября 2009

Инструмент Leaks говорит мне, что у меня есть утечка в этом фрагменте кода. Почему это так?

Этот фрагмент кода находится в viewDidLoad().

UINavigationItem *navItem=[self navigationItem];

UIBarButtonItem *addFeed = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addFeed)];
[navItem setRightBarButtonItem:addFeed]; // leaks says that 128 bytes leaked
[addFeed release];

UIBarButtonItem *reload = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh  target:self action:@selector(reload)];
[navItem setLeftBarButtonItem:reload]; // leaks says that 128 bytes leaked here too !
[reload release];
[navItem release];

Ответы [ 6 ]

6 голосов
/ 05 октября 2009

Вы не должны выпускать navItem. Вы не распределили / не сохранили / не создали / не создали его, поэтому не выпускаете его.

Кроме этого, ваш код выглядит нормально. Это все в методе?

3 голосов
/ 05 октября 2009

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

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

2 голосов
/ 06 октября 2009

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

Сборка> Построение и анализ

он будет использовать LLVM-Clang для статического анализа вашего кода красивым способом.

http://developer.apple.com/mac/library/featuredarticles/StaticAnalysis/index.html

UPDATE:

в вашем фрагменте кода:

UINavigationItem *navItem=[self navigationItem];

UIBarButtonItem *addFeed = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addFeed)];
[navItem setRightBarButtonItem:addFeed]; // leaks says that 128 bytes leaked
[addFeed release];

Ваша утечка, вероятно, связана с установкой нового rightBarButtonItem без освобождения старого.

Вот что я думаю:

1) получить дескриптор элемента навигации (имеет правую кнопку A)

2) создать новый элемент UIBarButton (делая правую кнопку B)

3) установить RightBarButtonItem в кнопку B

теперь где кнопка А? он должен был быть выпущен navItem при установке новой кнопки. так что вы могли забыть отпустить кнопку, когда устанавливаете ее в первый раз, или у вас есть удержание в другом месте.

0 голосов
/ 22 февраля 2011
 [navItem setRightBarButtonItem:addFeed];

 [navItem setLeftBarButtonItem:reload];

Вы создаете копии объектов в этих средствах доступа. Эти средства доступа увеличивают значение retainCount на 1. Ваши средства доступа должны освободить каждый объект, а затем немедленно сохранить их.

Пример:

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

Взгляните на методы здесь: Программирование управления памятью

Я верю, что все в порядке. Итак, взгляните на эти два аксессуара.

0 голосов
/ 05 октября 2009

Похоже, вы не выпускаете контроллер вида с пользовательским viewDidLoad методом.

0 голосов
/ 05 октября 2009

У вас есть NSZombieEnabled? Это приводит к тому, что объекты не сохраняются экземплярами NSZombie, и вы увидите «утечки» при запуске инструмента «Утечки».

...