前言:工作中可能会遇到各种各样的问题,有时解决完了再次遇到时,如果没有做笔记且相隔时间较长时,会容易忘记。故在此记录工作中遇到的一些问题,权当本人笔记,大神请勿吐槽,将持续更新...
一、ARC下控制器在被pop后移出栈后会被释放,但有些时候会发现控制器出栈的时候不会调用dealloc方法,归根结底,是因为当前控制器被某个对象强引用了,控制器的引用计数不为0,系统无法帮你释放这部分内存。原因大致有以下几点:
1.控制器中NSTimer没有被销毁
2.viewController中的代理不是weak属性
3.viewController中block的循环引用
二、Masonry 对控件添加约束后,并不会立即生效,frame 仍然是 0。如果此时我们需要这个 frame,应该怎么做呢?
想要在布局代码结束就立即获取当前某个控件正确的 frame,需要调用[self layoutIfNeeded]。通常和[self setNeedsLayout]一起使用。
例如:
[child mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(20,20));
make.top.left.mas_equalTo(50);
}];
child.layer.cornerRadius = child.bounds.size.width/2;
child.layer.masksToBounds = YES; //设置头像为圆形
设置头像圆形会无效。改正:
[child mas_makeConstraints:^(MASConstraintMaker *make) {
make.size.mas_equalTo(CGSizeMake(20,20));
make.top.left.mas_equalTo(50);
}];
[child setNeedsLayout];
[child layoutIfNeeded];
child.layer.cornerRadius = child.bounds.size.width/2;
child.layer.masksToBounds = YES; //设置头像为圆形
三、iOS 强制屏幕旋转
如果需要代码设置屏幕旋转,必须在项目target里面general设置Device Orientation支持旋转的方向,否则代码设置旋转也会无效
NSNumber *resetOrientationTarget = [NSNumber numberWithInt:UIInterfaceOrientationUnknown];
[[UIDevice currentDevice] setValue:resetOrientationTarget forKey:@"orientation"];
NSNumber *orientationTarget = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight];
[[UIDevice currentDevice] setValue:orientationTarget forKey:@"orientation"];
四、iOS 第三方库冲突的处理
首先按照上述错误中提到的路径找到库文件:/Users/tony/Desktop/XXXProject/Lib/libMiPushSDK.a,将它拷贝一份出来做进一步处理。
1、cd ~/ && mkdir librepack && cd librepack
2、cp /Users/tony/Desktop/XXXProject/Lib/libMiPushSDK.a ./libx.a
查看包信息:lipo -info libx.a
如果提示fat file,那么代表这个包是支持多平台的,例如armv7,armv7s,i386等,这需要我们逐一做解包重打包操作。否则我们只需要做一次[3-8]操作即可
3、创建临时文件夹,用于存放armv7平台解压后的.o文件:mkdir armv7
4、取出armv7平台的包:lipo libx.a -thin armv7 -output armv7/libx-armv7.a
5、查看库中所包含的文件列表:ar -t armv7/libx-armv7.a
6、解压出object file(即.o后缀文件):cd armv7 && ar xv libx-armv7.a
7、找到冲突的包(JSONKit),删除掉rm JSONKit.o
8、重新打包object file:cd .. && ar rcs libx-armv7.a armv7/*.o,可以再次使用[2]中命令确认是否已成功将文件去除
9、将其他几个平台(armv7s, i386)包逐一做上述[3-8]操作
10、重新合并为fat file的.a文件:
lipo -create libx-armv7.a libx-armv7s.a libx-i386.a -output libMiPushSDK-new.a
11、拷贝到项目中覆盖源文件:
cp libMiPushSDK-new.a /Users/tony/Desktop/XXXProject/Lib/libMiPushSDK.a
四、Xcode10之后引入第三方头文件必须用尖括号
Xcode10以后,苹果采用了新的构建模式,把build System的默认改成了 New Build System,之前的改为了Legacy Build System。
所以,如果你是Xcode10之后创建的项目。那么导入第三方头文件就得用尖括号,如果想用双引号导入,那么就修改 build System 为 Legacy Build System。