1.删除ToolBar下面的分割线
toolbar.showsBaselineSeparator = NO; |
2.修改TextField的蓝色或橙色边框
self.textField.focusRingType = NSFocusRingTypeNone; |
3.打开已安装的其他软件
// 1 |
4.打开网页
[[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString:@"https://www.baidu.com"]]; |
5.Color生成纯色图片(iOS)
// 生成纯色图片 |
6.时间格式转换
/// 根据格式生成时间字符串 |
7.合法性
- 手机号是否合法
+ (BOOL)isValidMobile:(NSString *)mobile { |
- Url是否合法
+ (BOOL)isValidUrl:(NSString *)urlStr { |
- 银行卡是否合法
+ (BOOL)isValidCardNo:(NSString *)cardNumber { |
- 判断邮箱是否合法
+ (BOOL)isValidEmail:(NSString *)email {
if ([CCUtility checkEmptyString:email]) return NO;
NSString *emailRegex = @"^(([a-zA-Z0-9_-]+)|([a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)))@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTest evaluateWithObject:email];
}
+ (BOOL)isValidUrl:(NSString *)urlStr {
NSString *regex =@"[a-zA-z]+://[^\\s]*";
NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
return [urlTest evaluateWithObject:urlStr];
} - 判断身份证(中国大陆)身份证是否合法
+ (BOOL)isValidIDCardNo:(NSString *)value { |
8.强弱引用
// 推荐使用(摘自YYKit) |
9.NSLog的宏定义
10.判断是否为空
11.使用xib
创建自定义View并在背景添加点击事件
说明:xib
创建的自定义视图,添加的背景点击动作不会触发点击事件,因此需要单独添加一个xibView
,添加到自定义视图上,点击动作添加到xibView
上就可以触发点击事件了,具体步骤如下:
- 创建自定义
FSCommonView
、创建FSCommonView.xib
、关联到自定义的FSCommonView
。 - 将xib添加到
FSCommonView
中
@interface FSCommonView : UIView
@end
@interface FSCommonView ()
@property (strong, nonatomic) UIView *xibView;
@end
@implementation
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.xibView = [self loadViewFromNib];
[self settingUI];
}
return self;
}
- (instancetype)initWithCoder:(NSCoder *)coder {
self = [super initWithCoder:coder];
if (self) {
self.xibView = [self loadViewFromNib];
[self settingUI];
}
return self;
}
- (UIView *)loadViewFromNib {
UIView *xibView = [[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil].firstObject;
xibView.frame = self.bounds;
[xibView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(xibBgViewClick)]];
[self addSubview:xibView];
return xibView;
}
- (void)settingUI {
// 设置背景色、圆角、边框、自定义子视图等。
}
- (void)xibBgViewClick {
// 背景点击事件
}
@end12.啄幕鸟
啄幕鸟,阿里开源项目,即手机屏幕上的啄木鸟,专抓App里的Bug。啄幕鸟集合了UI检查、对象查看、方法监听等多种开发工具,通过拾取UI控件、查看对象属性、监听方法调用、App内抓包等,不依赖电脑联调,直接获取运行时数据,快速定位Bug,提高开发效率。
功能简介
- UI检查:快速查看页面布局、UI控件间距、字体颜色、UI控件类名、对象属性/成员变量、图片URL等。
- JSON抓包:便捷JSON抓包工具,通过监听系统json解析抓包。
- 方法监听:Bug听诊器,可监听App中任意OC方法的调用,输出调用参数、返回值等信息,可以通过屏幕日志输入监听、KVC取值等命令,支持后台配置命令。
- po命令:执行类似LLDB的po命令,在App运行时执行po命令,调用任意方法。
- 系统信息:查看各种系统名称、版本、屏幕、UA等信息,支持外部添加信息。
- SandBox:查看沙盒文件,导出文件等。
- Bundle:查看、导出Bundle目录中的内容。
- Crash:查看Crash日志,需先打开一次Crash插件以开启Crash监控。
- Defaults:查看、新增、删除User Defaults。
- 清除数据:清除所有沙盒数据、User Default。
- 触点显示:显示手指触控。
- UI对比:支持将设计图导入到App中进行对比,并可画线、标注需修改的地方,方便UI走查。
- 查看图片资源:查看、导出App中的资源图片。
- CPU:查看CPU占用。
- 内存:查看内存占用。
- FPS:查看App帧率。
- 网络流量:查看发送、接收网络流量。
pod 'YKWoodpecker' |
官方github地址:YKWoodpecker
使用
// 显示啄幕鸟,启动默认打开UI检查插件 |
13.ViewController的生命周期、执行顺序
1. initWithCoder:通过nib文件初始化时触发。 |
14. 去除Cocopods
第三方库部分警告和MobileCoreServices.framework
过期的问题
在Podfile
的末尾处添加如下代码,再 pod install
post_install do |pi| |
15. 解决NSTimer
循环引用的问题
解决方法如下:
方式一
- timer改为弱引用
@property (weak, nonatomic) NSTimer *timer;
- 在适当的时机销毁timer
- (void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if (self.timer) {
[self.timer invalidate];
self.timer = nil;
}
}如果控制器
push
到下个控制器,viewDidDisappear
执行后,timer被销毁,下次进入APP的时候还要重新创建- 在
viewWillAppear
开启定时器
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
if (!self.timer) {
self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(showMsg) userInfo:nil repeats:YES];
}
}方式二
为
self
添加proxy
- 方式三
16. lldb(gdb)常用的控制台调试命令?
- p 输出基本类型。是打印命令,需要指定类型。是print的简写
p (int)[[[self view] subviews] count]
- po 打印对象,会调用对象description方法。是print-object的简写
po [self view]
- expr 可以在调试时动态执行指定表达式,并将结果打印出来。常用于在调试过程中修改变量的值。
- bt:打印调用堆栈,是thread backtrace的简写,加all可打印所有thread的堆栈
- br l:是breakpoint list的简写
17. iOS的沙盒目录结构
1). Application:存放程序源文件,上架前经过数字签名,上架后不可修改。
2). Documents:常用目录,iCloud备份目录,存放数据。(这里不能存缓存文件,否则上架不被通过)
3). Library:
Caches:存放体积大又不需要备份的数据。(常用的缓存路径)
Preference:设置目录,iCloud会备份设置信息。
4). tmp:存放临时文件,不会被备份,而且这个文件下的数据有可能随时被清除的可能。
18. 安装包优化
1.1 安装包的构成
包含资源和可执行文件 Mach-o 两部分,其中资源包括 Assets.car 文件和其他资源
1.1.1 Mach-o
Mach-o是iOS上的可执行文件,是由代码源文件经过编译和静态链接获取的。经过App Slicing之后的Mach-o文件往往只包含单个架构。
1.1.2 Assets.car
Assets.car 是Asset catalog 的构建产物。Xcode中的actool负责构建Assets.car 。在构建Assets.car的过程中actool会按照一定的策略编码算法,对png图片进行编码。
1.2 资源大小优化
1.2.1 使用合适的资源压缩配置
1.2.2 使用 RGB with palette 压缩图片
19. UITableView键盘隐藏的问题
@property (nonatomic, strong) UITableView *tableView; |
20. 数组去重
NSOrderedSet去重
- (NSArray *)removeDuplicateArr:(NSArray *)arr {
NSOrderedSet *orderSet = [NSOrderedSet orderedSetWithArray:arr];
return orderSet.array;
}ValueForKeyPath去重
- (NSArray *)removeDuplicateArr:(NSArray *)arr {
arr = [arr valueForKeyPath:@"@distinctUnionOfObjects.self"];
return arr;
}其他
- (NSArray *)removeDuplicateArr3:(NSArray *)arr {
NSMutableArray *mArr = [NSMutableArray arrayWithCapacity:arr.count];
for (NSString *str in arr) {
if (![mArr containsObject:str]) {
[mArr addObject:str];
}
}
return mArr;
}
- (NSArray *)removeDuplicateArr4:(NSArray *)arr {
NSMutableDictionary *mDict = [NSMutableDictionary dictionaryWithCapacity:0];
for (NSString *str in arr) {
[mDict setObject:str forKey:str];
}
return mDict.allKeys;
}
- (NSArray *)removeDuplicateArr5:(NSArray *)arr {
NSMutableArray *mArr = [NSMutableArray arrayWithArray:arr];
for (NSString *str in arr) {
if ([mArr containsObject:str]) {
[mArr removeObject:str];
}
}
return mArr;
}21. iOS 判断平面上一个点是否在不规则的封闭区域内
1. 在二维空间创建不规则封闭区域
1.1 路径绘图
CGMutablePathRef pathRef = CGPathCreateMutable();
1.2 路径连线
CGPathMoveToPoint(pathRef, NULL, 83.277656, -169.938307);
CGPathAddLineToPoint(pathRef, NULL, 21.083895, -169.938307);
CGPathAddLineToPoint(pathRef, NULL, 21.083895, -36.617291);
CGPathAddLineToPoint(pathRef, NULL, 83.877837, -35.508388);
CGPathAddLineToPoint(pathRef, NULL, 83.277656, -169.938307);1.3 关闭绘图
CGPathCloseSubpath(pathRef);
2. 判断任意点是否在此区域内
CGPoint point= CGPointMake(aircraftLocation.latitude, aircraftLocation.longitude);
BOOL containsPoint = (CGPathContainsPoint(pathRef, NULL, point, NO));
个人博客: 🏡 ForgetSou