(iphone), что происходит с подпредставлениями, когда суперпредставление отменяется? - PullRequest
1 голос
/ 24 апреля 2011

Предположим, что представление (A) имеет подпредставления. Представление (A) становится освобожденным, потому что его счетчик отсчетов обращается в ноль.

Что происходит с подвидом представления (A)?
Отстраняются ли они (удаляются ли из вида А) и уменьшается ли количество их хранения соответственно?

Спасибо

Ответы [ 4 ]

1 голос
/ 24 апреля 2011

Предполагая, что под 'view' вы на самом деле имеете в виду 'экземпляр UIView':

Представления сохраняют свои подпредставления, и поэтому, если представление освобождается, его подпредставления освобождаются, и их количество уменьшается на единицу.

Я не уверен, но я думаю иерархия представления реализована так:

@interface UIView : UIResponder {
  NSArray *_subviews;
}

@property(nonatomic, retain) NSArray *subviews;

@end

@implementation UIView
@synthesize subviews;
- (void)dealloc {
  [subviews release];
  [super dealloc];
}
@end

Вы можете примерно сказать, что NSObject объявляет целое число без знака, которое является счетчиком сохранения, например:

unsigned retainCount;

Тогда это будут реализации -[id<NSObject> retain] и -[id<NSObject> release]:

- (void)retain {
  retainCount++;
}

- (void)release {
  retainCount--;
  if (retainCount == 0) {
    [self dealloc];
  }
}
0 голосов
/ 15 апреля 2016

Deloc для суперпредставления вызовет в подпредставлениях removeFromSuperview , затем в подпредставлениях willMoveToSuperview в «Сообщает представлению о том, что его суперпредставление собирается изменить на указанное суперпредставление.», В этот случай должен быть раскрыт.

Установка точки отладки в подвиде willMoveToSuperview может легко это проверить.

Так что, если subviews является свойством kvo superview, то здесь хорошее место, чтобы удалитьObserver, потому что если мы сделаем это, subviews dealloc, который будет вызван позже, уже слишком поздно. Мы получим исключение, например, «NSInternalInconsistencyException», причина: «Экземпляр 0x135a9a600 класса UITableView был освобожден, в то время как наблюдатели значения ключа все еще были зарегистрированы в нем.

0 голосов
/ 25 апреля 2011

Если основной вид освобождается или освобождается, тогда все дочерние представления внутри него также будут освобождены

0 голосов
/ 25 апреля 2011

Все подпредставления будут выпущены.

...