1. 粗心大意造成的循环引用
一开始发现页面通知的监听失效,后来发现页面pop关闭的时候dealloc方法也不调用, 经过多番调试与排查发现罪魁祸首居然是MJRefreshHeader的block方法的循环引用造成的,可以说是使用不当了,以为不会互相引用....太年轻了
如下这段代码,就是元凶 ,错误示范❌ 这样会造成循环引用,导致通知失效
MJRefreshNormalHeader *refreshHeader = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
[self.tableView.mj_header endRefreshing];
}];
self.tableView.mj_header = refreshHeader; //此时的refreshHeader是被强引用 了
2. 导航栏的起始点问题(毛玻璃惹的锅)
self.navigationController.navigationBar.translucent = YES; //透明
设置translucent = YES
的时候,导航栏是透明的,从(0,0)开始计算坐标原点
self.navigationController.navigationBar.translucent = NO;
设置为NO的时候是不透明的,是从(0,64)开始计算
3. IB_Designable不支持pod方式的IB使用
Pod导入的,爆红色提示信息 fail to load designable from path (null),但是编译器仍然能够运行,这一点让人很尴尬,甚至YYKit的作者也是很绝望,给出清缓存,重启Xcode,重启电脑……换库等措施……也有人提issue说用use_frameworks!可以用。。。。
后来群里讨论的结果是,pod默认是打包静态库的,然后引用可能出了问题,但是用use_frameworks!这种方式是swift开发的,OC很多库可能会有坑,于是我抱着试试看的心态,不使用pod,直接使用文件导入的方式,结果就可以了,这个bug真是很奇怪,都说是Xcode的锅,这里记录一笔,以免日后再次踩坑。
4. Xcode控制台打印一些看不懂的玩意儿 (Xcode 8 历史遗留问题)
objc[10294] :Class VCWeak0bjectHolder is implemented in both /Applications/Xcode.app/Contents/Developer/Platforms/
iPhone0S.platform/Developer/Library/Coreimulator/Profiles
Runtimes/i0S.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AVConference.framework/Frameworks/ViceroyTrace.framework/ViceroyTrace (0x12d3734d0) and /Applications/Xcode.app/Contents/Developer/Platforms/
iPhone0S.platform/Developer/Library/Coreimulator/Profiles
Runtimes/i0S.simruntime/Contents/Resources/RuntimeRoot/System/Library/PrivateFrameworks/AVConference.framework/AVConference
(8x12c49fe38).One of the two will be used. Which one is undefined.
Could not successfully update network info during initialization.
Name | Value |
---|---|
OS_ACTIVITY_MODE | disable |
Environment Variables
在项目的Edit scheme 里找到环境变量(Environment Variables)的设置
在Scheme里面添加键值Name: OS_ACTIVITY_MODE Value: disable
添加之后运行项目,干干净净... 除了自己的Debug打印之外,再无其他,写代码肯定是想要自己能够掌控全局,如果出现一些不知道的玩意,还不确定是不是bug的玩意儿,让人心里很慌,因为心里没底很不爽...
5. 拉约束或者是计算一些布局的一些技巧
如何拉等分的约束?
比如三等分约束:
先拉一个水平居中的约束,然后调整Multiplier , 1/3 = 0.5 * (?) ,所以 Multiplier=2/3, 以此类推, 2/3 = 0.5 * (?) ,所以 Multiplier= 4/3
四等分: 一半的一半...这个好拉
五等分: 1/5 = 0.5 * (?) 2/5嘛.... 再多也是这个道理 可以计算的
6. 动态创建单例的方法,人人都是单例~ (切忌单例的滥用)
@implementation NSObject (Singleton)
//使用可变字典存储每个类的单一实例,键为类名,值为该类的对象;
//声明为静态变量,可以保存上次的值;
static NSMutableDictionary *instanceDict;
id instance;
+ (instancetype)sharedInstance {
@synchronized(self)
{
//初始化字典;
if (instanceDict == nil) {
instanceDict = [[NSMutableDictionary alloc] init];
}
//获取类名;
NSString *className = NSStringFromClass([self class]);
if (className) {
//查找字典中该类的对象,使用类名去进行查找,可以确保一个类只被存储一次;
instance = instanceDict[className];
if (instance == nil) {
//该类的对象还没实例化,就进行初始化,并根据键值对的形式存储;
instance = [[self.class alloc] init];
[instanceDict setValue:instance forKey:className];
}else{
//该类对象已经存储在字典中,直接返回instance即可;
}
}else{
//没有获取类名,所以确保sharedInstance是一个类方法,用类进行调用;
}
return instance;
}
}
@end
7. Xode代码块使用技巧
添加是拖动一块代码到 {} 区域,然后设置shortcut
删除就是delete
把代码块文件拷贝到 ~/Library/Developer/Xcode/UserData/CodeSnippets 目录下即可
一般这个操作是用于转移电脑的时候 用自己熟悉的代码块 自然爽咯
8. iOS 一些权限字段适配问题
NSBluetoothPeripheralUsageDescription
App需要您的同意,才能访问蓝牙
NSCalendarsUsageDescription
App需要您的同意,才能访问日历
NSCameraUsageDescription
App需要您的同意,才能访问相机
NSHealthShareUsageDescription
App需要您的同意,才能访问健康分享
NSHealthUpdateUsageDescription
App需要您的同意,才能访问健康更新
NSLocationAlwaysUsageDescription
App需要您的同意,才能始终访问位置
NSLocationUsageDescription
App需要您的同意,才能访问位置
NSLocationWhenInUseUsageDescription
App需要您的同意,才能在使用期间访问位置
NSMicrophoneUsageDescription
App需要您的同意,才能访问麦克风
NSMotionUsageDescription
App需要您的同意,才能访问运动与健身
NSPhotoLibraryUsageDescription
App需要您的同意,才能访问相册
NSRemindersUsageDescription
App需要您的同意,才能访问提醒事项