Я имею дело с утечкой памяти, и отладчики не сильно помогли. Я заметил, что некоторые из моих контроллеров просмотра остались в памяти после того, как их уволили. Я предполагаю, что есть сильная ссылка, и я искал это.
- Для каждого из моих классов я хотел бы включить
deinit
, который регистрирует сообщение. Так я впервые узнал, что объекты не были освобождены. - Когда я исследовал график памяти, я обнаружил контроллеры представления, которые были отключены, но все еще находятся в памяти. Ничто визуально не выглядело как цикл сохранения. Все ссылки
weak var
. Не было никаких предупреждений от Xcode. - Когда я пропустил мемграф через утечки, он сообщил:
0 leaks for 0 total leaked bytes.
Когда я играл с утечками, я заметил команду под названием traceTree
. Я запустил его с адресом объекта, которого не должно быть. Он сообщил следующее ...
2 <CaptureViewController 0x7fee7a008800> [1536]
2 <WaterfallCollectionViewLayout 0x7fee47c0b450> [368] +264: delegate 0x7fee47c0b558
2 <UICollectionView 0x7fee7a060e00> [3072] +1744: __strong _layout 0x7fee7a0614d0
1 0x7fee47c10590 [112] +24: 0x7fee47c105a8 --> offset 2
+ 1 0x7fee7b028000 [16896] +10600: 0x7fee7b02a968
+ 1 Region libobjc.A.dylib __DATA __bss: 'objc::AssociationsManager::_mapStorage' 0x7fff89c160c8
1 0x7fee67d02c30 [304] +112: 0x7fee67d02ca0
1 0x7fee67d02100 [304] +8: 0x7fee67d02108
1 0x7fee7900be00 [8704] +2432: 0x7fee7900c780
1 Region dyld __DATA __common: '_main_thread' + 800 0x1155e1060
Вопрос : Я действительно не знаю, на что смотрю. Это говорит мне о том, что есть сильная ссылка от WaterfallCollectionViewLayout
до CaptureViewController
?
CaptureViewController
- это UICollectionViewController
, а WaterfallCollectionViewLayout
- это пользовательский UICollectionViewLayout
. Класс макета использует контроллер представления коллекции в качестве делегата для целей макета. Похоже на это ...
protocol WaterfallCollectionViewLayoutDelegate: class {
func waterfallCollectionViewLayout(_ waterfallCollectionViewLayout: WaterfallCollectionViewLayout, sizeForCellAt indexPath: NSIndexPath, fitting size: CGSize) -> CGSize
}
class WaterfallCollectionViewLayout: UICollectionViewLayout {
/* ... */
weak var delegate: WaterfallCollectionViewLayoutDelegate!
/* ... */
}
Любые предложения или советы будут с благодарностью.