iOS开发 | 实用技能&小知识点(持续更新)
1.切换debug和release模式
2. 相当于VVDocument插件的注释快捷键
快捷键:cmd+alt+/
效果:
3. 查看当前视图控制器的类名
使用符号断点,详情:http://www.jianshu.com/p/ef05d90979cf
4. 查看某个控件的类名
打开Debug View Hierarchy,点击你想查看类名的控件
5. 一秒打包
将products文件夹中的.app文件直接拖到iTunes,然后再拖出来
将这个文件拖到iTunes
在finder中显示
这个就是我们打包好的IPA文件
6. 从一个UIViewController跳转到一个UINavigationController
/** 跳转到主页 */
- (void)gotoMainVC{
Xhany *mainVC = [[Xhany alloc] initWithNibName:nil bundle:nil];
UINavigationController *mainNavi = [[UINavigationController alloc]initWithRootViewController:mainVC];
[self presentViewController:mainNavi animated:YES completion:^{
[UIApplication sharedApplication].keyWindow.rootViewController = mainNavi;
}];
}
7. 快速查看Xcode自带的文档
离线文档,没网也可查看。快捷键:shift+cmd+数字0,遇到没见过的方法,先去文档里查看,多看文档少扯蛋。
8. 让UILabel高度自适应内容
调用sizeToFit即可
9. 将button的image调小
// 调整图片到上左下右边距的距离
leftButton.imageEdgeInsets = UIEdgeInsetsMake(0, 40, 0, 40);
10. 人人都可以轻松搭建内测平台
蒲公英,蒲公英除了方便开发者和测试妹儿,也方便了产品了解开发进度,甚至,如果只是公司内部人员使用此APP,无需发布到App Store,直接将指定设备的UDID加入,然后把链接发出去即可。
11. 白天上架,轻松愉快(经验而已)
记得用ApplicationLoader哦😯
12. UITextField的placeHolder也可以是富文本
其实是attributedPlaceholder
self.inputPasswordTextField.attributedPlaceholder = attributeText;
13. 判断label当前有几行
UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(90, 90, 80, 100)];
[self.view addSubview:label];
label.text = @"33431dfadfdafadsfasfsdf";
label.numberOfLines = 0;
label.font = [UIFont systemFontOfSize:13];
NSDictionary *attrs = @{NSFontAttributeName : [UIFont systemFontOfSize:13]};
// 总高度
CGFloat totalHeight = [label.text boundingRectWithSize:label.frame.size options:NSStringDrawingUsesLineFragmentOrigin attributes:attrs context:nil].size.height;
// 每行文字的高度
CGFloat lineHeight = label.font.lineHeight;
// 行数 = 总高度除以每行高度
NSInteger lineCount = totalHeight / lineHeight;
NSLog(@"lineCount:%ld",lineCount);
14. 返回码所代表的含义
HTTP协议状态码表示的意思主要分为五类 ,大体是 :
——————————————-
1×× 保留
2×× 表示请求成功地接收
3×× 为完成请求客户需进一步细化请求
4×× 客户错误
5×× 服务器错误
15. 最强大的编程技术问答网站
Stack Overflow
如果在这里都解决不了的问题,那么通常都是你提问的方式有问题。
16. 在.h和.m文件快速切换的快捷键
ctrl+cmd+方向键上或下
17. 判断控件里的image的名称是不是xx
if ([imageView.image isEqual:[UIImage imageNamed:@"iu"]]) {
NSLog(@"一样");
}else{
NSLog(@"不一样");
}
18. 加了全局异常断点,程序还是崩溃在main函数怎么定位bug?
勾选Zombie Objects即可
19. 生命周期方法可以主动调用,如:
[self viewWillAppear:YES];
不过感觉这种写法有点小小的蛋疼😌
20. 在控制台中使用git,红色表示没有add,绿色表示没有commit。
21. APP显示角标
[UIApplication sharedApplication].applicationIconBadgeNumber = _orderNum;
22.判断是否是debug模式
#ifdef DEBUG
// 如果是debug模式
NSLog(@"debug");
#else
// 如果不是debug模式
NSLog(@"非debug");
#endif
23.三元不要嵌套三元
我们用三元是为了让代码更简洁,但是如果三元嵌套三元就影响可读性了(如果真要嵌套,请先确保可读性)。
24.对于后台返回的浮点型要谨慎
由于浮点数的存储是不精确存储,所以对于敏感信息如价钱价格最好不要让后台返回float型,一般返回int型或string型。当然对于像经纬度这种不是特别敏感的,返回float型也可以。
25.函数和方法的区别
26.开发者账号到期了会怎样?
你的APP会从App Store里消失,等你给账号充值后又会重新出现。(苹果会在到期30天前提醒你,喊你交钱,不交钱让你好看 )
27.如何查看开发者账号的过期时间?
28.证书被吊销了怎么办?
29.想看APP的内存使用情况,但是显示却是0怎么办?
在EditScheme中将Zombie Objects去掉,重新运行即可
30.保管好DSYM文件
为了方便找回Crash对应的dSYM文件和还原堆栈,建议每次构建或者发布APP版本的时候,备份好dSYM文件。(dsym文件的作用是:配合crash监控平台如腾讯bugly定位线上APP崩溃的代码位置)
31.push到新页面,顶部空出20像素
解决方法:self.automaticallyAdjustsScrollViewInsets = NO;
32.imageView设置了图片但是未展示
可能你项目中有重复命名的图片。修改过后记得clean。
33.Xcode编译报错却可以继续运行
可能你项目中有重复命名的图片。修改过后记得clean。
34.清理Xcode编译项目产生的缓存垃圾
手动删除:
打开菜单的前往->前往文件夹输入—> ~/Library/Developer/Xcode/DerivedData
35.删除Xcode中多余的provisioning profile
手动删除:
打开菜单的前往->前往文件夹输入—> ~/Library/MobileDevice/Provisioning Profiles
36. UIButton的setImage和setBackgroundImage的区别
setBackgroundImage的imageView和button一样大,并且不能通过imageEdgeInsets来调整imageView的大小。使用setImage可以随意调整按钮图片大小。
37.遍历加强版(for in加强版,能获取索引的遍历)
NSArray *arr = @[@1,@2,@3,@4,@5];
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"对象==%@",obj);
NSLog(@"下标==%ld",idx);
if ([obj integerValue] == 3) {
// 遍历到3时结束
NSLog(@"结束");
*stop = YES;
}
}];
38.获取masonry布局控件的frame
调用其父控件的layoutIfNeeded
方法。
39.真机调试崩溃,但是未抛出任何错误并且Xcode直接结束run。
很可能是内存爆炸导致的。详情:ios app crashes with no error and no crash report
40.用谷歌别用百度。
真的,谁用谁知道。。。
41.让timer不因scrollView的滚动而停止
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
42.NSTimer可以设置的最小时间间隔是0.01s
具体数字无从核实,然后我去问了一下:
What's the min timeInterval of NSTimer is valid?
43.使用通知注意移除,不然在iOS8可能崩溃。
一般在对称方法里移除,如:在init:
方法里添加,就在dealloc
方法里移除;在viewWillAppear:
添加,就在viewWillDisappear:
里移除。
听说使用RAC无需移除通知,可以尝试下哦。
44.使用timer不要忘了及时释放
一定要有这个意识:看到timer就条件反射的提醒自己千万别忘了释放。
45.APPStore里的展示图若无特殊要求,设置一套5.5的即可
详情:AppStore截图尺寸要求、更换全攻略!(iphone ipad)
45.抓包HTTPS
可以参考这篇文章,亲测完美抓取:
Charles iOS抓包Https,iOS最新系统抓包
46.如何快速获取一张网络图片的URL?
在图片上右击-->拷贝图像地址即可:
47.如何应对后台返回的null?
将null转为nil,可以使用这个三方:
NullSafe
48.属性和实例变量的区别
属性 = 实例变量 + get方法 + set方法
49.使用APP时手机发热严重
仔细查看是那个操作让你的CPU暴涨,看你的代码里面是否有死循环。
CPU如果一直这么高肯定是有问题的
50.使用CABasicAnimation,按home键后再切回来动画停止的解决方法:
设置animation.removedOnCompletion = NO;
51.imageWithContentsOfFile方法不能加载Assets.xcassets里的图片
谨记
52.imageNamed和imageWithContentsOfFile的区别
imageNamed会将图片cache到内存。
53.RAC在iOS9上正常,在iOS8上崩溃
54.执行了视图控制器的dealloc但是instrument显示存在内存泄漏
dealloc 执行只能保证本对象里面没有存在的内存泄漏点,但是不保证本对象所持有的其他对象,以及其他对象所持有的其他对象没有内存泄漏,
要保证没有内存泄漏,要保证所有对象的dealloc 都要执行 (来自Cocoa China 版主的回答)
55.archive失败,并提示error: Invalid bitcode version (Producer: '800.0.35.0_0' Reader: '703.0.31_0')
将Enable Bitcode 设为 NO.
56.三目还可以这样写
NSString *a = nil;
NSString *b = a ?: @"222";
这时b的值是222.
57.UIView动画期间view的用户交互是关闭的
During an animation, user interactions are temporarily disabled for the views being animated. (Prior to iOS 5, user interactions are disabled for the entire application.)
58.让UIButton按下时颜色不变
button.adjustsImageWhenHighlighted = NO;
59.同时重写getter和setter
@synthesize name = _name;
- (NSString *)name {
NSLog(@"调用了getter");
return @"jack";
}
- (void)setName:(NSString *)name {
NSLog(@"调用了setter");
_name = name;
}
60.view的默认tag为0
这就是为什么循环创建view时tag不从0开始的原因。
61.关闭键盘的自动纠错功能
有时我们并不需要自动纠错,可以使用:
self.textField.autocorrectionType = UITextAutocorrectionTypeNo;
62.多个UITextField时关闭键盘
没必要对每个textfield都使用resignFirstResponder
,可以调用:
[self.view endEditing:YES];