iphone: какой вызов функции / метода увеличивает retainCounter?почему управление мемами ведет себя так странно? - PullRequest
0 голосов
/ 20 мая 2011

эй люди, У меня проблема с пониманием управления памятью в iphone.

У меня следующая странная ситуация:

            CAGradientLayer * hButtonLayer = [[CAGradientLayer alloc] init];
    NSLog(@"1: retaincounter is?: %d", [hButtonLayer retainCount]);
        [hButtonLayer setBounds:tempButton.bounds];
    NSLog(@"2: retaincounter is?: %d", [hButtonLayer retainCount]);
        [hButtonLayer setColors:[NSArray arrayWithObjects:
                                                        [UIColor colorWithRed:0.2 green:0.3 blue:0.4 alpha:1.0],
                                                        [UIColor colorWithRed:0.4 green:0.5 blue:0.6 alpha:1.0], nil]];
    NSLog(@"3: retaincounter is?: %d", [hButtonLayer retainCount]);
        [[tempButton layer] insertSublayer:hButtonLayer atIndex:0];
    NSLog(@"4: retaincounter is?: %d", [hButtonLayer retainCount]);

вывод на консоль показывает следующее:

1: retaincounter is?: 1
2: retaincounter is?: 2
3: retaincounter is?: 2
4: retaincounter is?: 3

хорошо, на 1) ясно, что счетчик равен 1, потому что слой выделен и инициализирован. но почему в 2) setBounds -methid увеличивает счетчик удержания? и в 3) счетчик сохранения не увеличивается методом setColors ... и insertSublayer снова увеличивает счетчик хранения!

почему эти методы увеличивают счетчик? откуда мне знать, если какой-то framework-метод что-то увеличивает? Я имею в виду, что если я уменьшу счетчик сохранения, а какой-то каркасный метод не увеличил счетчик, я получу сбой - как мне определить, увеличивает или нет метод увеличение счетчика удержания?

спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Не используйте счет сохранения в качестве средства отладки.Не зная, как реализованы системные и сторонние фреймворки, вы не можете знать, каким должен быть счет хранения.

Это очень просто:

  1. Если вы alloc или copy или retain объект, вы «владеете» им, и вам нужно либо release, либо autorelease его в какой-то более поздний момент
  2. В противном случае вы не владеете им и не несете ответственности заего память
0 голосов
/ 20 мая 2011

Как сказал Стивен, и любой контейнер, такой как NSArray, NSDictionary будет сохранять объект.Подвиды UIView поддерживаются массивом, поэтому любые добавленные подвиды будут сохранены.

Свойства объекта, политика управления памятью можно найти в документе Apple.Или вы можете перейти к определению класса и прочитать его объявление.

...