Нужен совет по управлению памятью - PullRequest
0 голосов
/ 21 ноября 2011

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

         BidView *bidView = [[[BidView alloc] init] autorelease];
         NSLog(@"%i",[bidView.seatsForTableCreated retainCount]);
         bidView.seatsForTableCreated = [NSArray arrayWithArray:seats];
         NSLog(@"%i",[bidView.seatsForTableCreated retainCount]);
         [self.navigationController pushViewController:bidView animated:YES];  `

NSLog говорит мне, что число сохраненных местForForableCreated увеличилось с нуля до двух.Затем, когда я выхожу из экрана BidView (ничего не делая с массивом seatForTableCreated), я делаю следующее:

NSLog(@"%i",[seatsForTableCreated retainCount]);
[seatsForTableCreated release];
NSLog(@"%i",[seatsForTableCreated retainCount]);

для меня совершенно неясно.Теперь NSLog сообщает мне (оба раза), что значение счетчика равно 1. Затем я повторяю эту процедуру (я имею в виду одно и то же приложение), и каждый раз все одинаково: 0-2-1-1.Итак, мои вопросы: 1) Почему от 0 до 2?Почему счет увеличивается до 2, а не до 1?2) почему тогда он падает до 1 без какого-либо влияния?3) Почему это все еще остается 1 после того, как я выпустил это?4) Как бы вы управляли памятью в таком случае?Большое спасибо заранее

Ответы [ 2 ]

2 голосов
/ 21 ноября 2011

В первую очередь. Не вызывайте и не используйте retainCount даром, думайте об этом свойстве как о частном, и только ОС может вызывать. Чтобы проверить, есть ли у вас утечка памяти, вы должны использовать инструменты.

Похоже, вы создали объект автоматического высвобождения ([NSArray arrayWithArray:seats]), поэтому не можете вручную освободить его.

И используйте инструмент Allocations Instrument, чтобы действительно проверить, есть ли у вас утечка памяти.

1 голос
/ 21 ноября 2011

Мой совет предполагает, что вы используете Xcode 4+ и не используете ARC,

command + shift + B проанализирует ваше управление памятью (и мертвые хранилища и тому подобное).Я думаю, вы поняли это правильно.Не беспокойтесь о счетах удержания, пока не получите жалобу от Analyze или не обнаружите утечки с помощью инструментов.Я не уверен, насколько надежны удержания.Я видел комментарии о том, что SO говорит, что не следует полагаться на них.

Вы хорошо следуете правилам New, Alloc, Copy, Retain -> Вам нужно будет освободить этот объект, когда вы закончите с ним.

Я также предполагаю, что в BidView.h ваше свойство объявлено как @property (nonatomic, retain) NSArray * seatForTableCreated;

Так что выпуск в методе dealloc в BidView.m является хорошим управлением памятью

РЕДАКТИРОВАТЬ Это работает, даже если вы не выделяете места для созданного стола, потому что.self.seatsForTableCreated = ... сохранит любой объект, который вы там устанавливаете.Поэтому, если у вас есть свойство с (retain) в объявлении, вы можете рассматривать

self.property = object;

как установку свойства и его сохранение.Свойства были добавлены в target-C для уменьшения аналогичного кода, присутствующего в каждом классе.

Свойство в .h

@property (nonatomic,retain) NSObject * property; // don't name your properties property..

Компилятор автоматически создаст для вас 2 метода, когда вы @synthesizeв .m

-(void)setProperty:(NSObject*)newP
{
    [newP retain];  // retains the new object so it sticks around for line 3
    [property release]; // releases previous property
    property = newP; // set the property to the object retained in line 1
    // property is now same as newP and you are responsible for releasing it
    // -(void) dealloc   is where you should release it
}

// Обратите внимание, что при создании метода // setProperty компилятор может не создавать точно такой же код, как указано выше.Если это произойдет, это может быть изменено.

-(NSObject*)property
{
    return property;
}

Я попытался выяснить, почему Analyze не улавливает проблему, если вы не освободили свою собственность, но не сделали этого.Это сбивает с толку, и я хочу исследовать это дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...