1. 高度或间距问题
- 改 collectionview 的间距, 可以把layout:sizeForItemAtIndexPath: 方法返回的值, 全部改成无限大或无限小(先不管 section)
- 如果依旧没什么用, 可以把layout:insetForSectionAtIndex:方法的值全部改成无限大或无限小(先不管 section), 也就是不计后果的那种.
2. 重叠问题
A页面继承于 B 页面, A 的页面明显超出了 B 的位置 ===> 全局搜索 super 方法, 只有initWithFrame:方法中有 super, 因此需要在创建 A 或 B 时, 各自单独调用initWithFrame:中的方法 ==> 原因是 A 继承了 B 的视图, 自己也创建了一份, 但是只给 A 的视图赋值并更新位置, 没有给 B 的视图赋值和更新位置.
3. 按钮显示后又消失问题
- 可以在按钮懒加载创建的地方插入断点, 或者在当前类中, 重写 get 方法, 在 get 方法中插入断点, 在 self. 代码处, 被调用, 但是没有发现被移除或被隐藏的地方.
- 由于是 UIButton, 可以在 UIButton的分类中, 重写 dealloc方法(分类中的方法会优先被调用), 确定当前视图是否被隐藏或被移除掉. ===> 结果是它的 dealloc 方法被调用了多次, 而且从调用关系结构图中发现, 其父类的 dealloc 方法也被调用了, 而且是在数组中被移除的. ===> 可以推断, 按钮消失的过程与父视图的被移除也是有关的.
4. 循环引用的两种常见情况:
- block 强引用
1. copy 的 block 属性里面含有 self
2. copy 的 block 属性里面含有 带有下划线的强应用
3. A对象拥有的 block 属性里面调用了 A 对象
4. A对象的 delegate 是 strong 属性(如CABasicAnimation的 delegate 是强引用, 可以参考http://www.chjsun.top/2017/01/04/animation/animation1/)
[_loadingView setLoadingFailedBlock:^{
//
weakself.loadingView.hidden = NO;
[weakself.loadingView loading];
[weakself loadNewData];
}];
- (PTVAlbumPhotoBrowserView*)photoBrowserView
{
if (_photoBrowserView == nil)
{
_photoBrowserView = [PTVAlbumPhotoBrowserView new];
_photoBrowserView.parentVc = self; //parentVc 是 strong 属性
}
return _photoBrowserView;
}
- 通知
1. addObserver:forKeyPath:options:context:方法, 没有及时的remove 掉.
2. 通过类似方法添加代理, `[[WuKongManager sharedInstance] registerRechargeGiftPackegData:self]`, 没有及时移除.
5. 定位客户问题
- 可以使用打点, 确定用户是否确实做了某些行为.