前言
预备以后每星期写一篇来总结一下本周的经验总结。本篇是第一篇。
1.如何在 xib 中的 UIScrollView 中放 UIView
设置好 UIScrollView 的Top、Leading、Trailing、Bottom 约束,并放入一个 UIView,并设置其Top、Leading、Trailing、Bottom 约束,会发现仍然会有约束报错。这是因为 superview 在给 subview 约束时,不是以 superview 的 size 为依据,而是以 superview 的 contentSize 为依据的。此时在 xib 中无法确定 UIScrollView 的 contentSize。
解决方法:额外再添加 subview 的 height、width 的约束
2.添加符号断点来解决约束冲突的问题
有时候,开发人员会利用如 Masonry 等第三方库来实现布局,有时候出现冲突,如何快速查找冲突点呢?
解决办法:添加 Symblic Breakpoint “UIViewAlertForUnsatisfiableConstraints”
3.添加符号断点来查找UICollectionView layout 报错的问题
有时候虽然有报错,仍能正常布局。但这会给代码带来后期维护上的隐患。添加符号断点,可以强迫去修正 layout。
解决办法:添加 Symblic Breakpoint “UICollectionViewFlowLayoutBreakForInvalidSizes”
4.UICollectionView UI 重用问题
有时候,我们不得不利用 UICollectionView 来对复杂 UI 进行布局。但 UICollectionView 的无论是 cell 还是 header、footer 都会运用到重用机制。有一些确定只需要一份的 UI,会因为重用机制,创建好几份,占用内存。
提供一种思路:将 UICollectionView 的 cell、header、footer 仅仅作为一个容器,本身不创建额外UI。由我们自己负责创建 UI,然后每次在 UICollectionView 的代理方法中,将 UI 添加上去。
5.一种少见的定时器循环引用
以下的代码是在公司别人写的代码。
- (void)timerAction {
/* 做一些定时器要做的事情 */
// 重新延时执行
[self performSelector:@selector(timerAction) withObject:nil afterDelay:3];
}
以上面实现的定时执行功能,同样会造成循环引用。这是因为 performSelector 这段代码会在当前线程的 runloop 里开启一个定时器来执行这个 selector。定时器和 self 会形成循环引用,造成内存泄漏。
解决办法:在适当时机,调用 [NSObject cancelPreviousPerformRequestsWithTarget:self]; 来停止定时器。