iOS开发时最应该注意的几点

1.解析数据的时候注意判空.

2.一些常用的长度单位和坐标单位一定要用float类型.

3.循环的时候要考虑死循环和异常时候的情况.

4.一些耗时的操作一定要放在子线程中.

5.调用方法的时候一定要看清楚方法是否调用正确,因为有一些同名的,类似的方法容易混淆,一定要看清楚方法名.

6.UITableView的单元格中如果有状态属性或者开关,一定要每次都初始化,再根据model进行赋值设置状态或者开关的值.这样单元格重用就不会混乱.

7.一定要看清需求文档,以免有遗漏.

8.如果是复制别的类中的代码,一定要看清楚是否是当前要设置的控件或者类.

9.数据库相关的SQL语句中的查询,一定要是对象,不能是基本数据类型NSInteger,是的话转换为NSNumber.

10.如果兼容iOS7的话,不能使用- (BOOL)containsString:(NSString *)str NS_AVAILABLE(10_10, 8_0);​这个方法,应该用NSRange rangeBeijing = [region_name rangeOfString:@"北京"];​

然后判断这个range的location是不是不能被找不到

if(rangeBeijing.location != NSNotFound​){

}​

11.UIImageView的contentMode属性,凡是没有带Scale的,当图片尺寸超过ImageView尺寸时,只有部分显示在ImageView中。UIViewContentModeScaleToFill属性会导致图片变形。UIViewContentModeScaleAspectFit会保证图片比例不变,而且全部显示在ImageView中,这意味着ImageView会有部分空白。UIViewContentModeScaleAspectFill也会证图片比例不变,但是是填充整个ImageView的,可能只有部分图片显示出来。

12.如果App中有推送功能,在Xcode安装运行的时候,一定要选择相应的证书,这样才能生成正确的deviceToken,如下图:

如果选择automatic,就会生成无效的deviceToken,导致推送不成功,如下图:

所以,在安装运行的时候一定要核对检查证书是否匹配正确再测试.还有重要的一点,系统设置中该应用的推送一定是允许的才可以收到推送消息.

13.指纹错误状态码解析:error.code=-1    ->    用户指纹错误不匹配; error.code=-8    ->    用户指纹信息被锁,需要密码才能解锁使用指纹信息.

14.设计数据库表的时候,记得设计几个冗余字段,以备以后使用.

15.UI的更新一定要放在主线程操作!!!比如酱紫:

//通知主线程刷新,异步操作,并不是同步操作

dispatch_async(dispatch_get_main_queue(), ^{

        //...........;

});

16.在iOS中,如果多个线程同时对一个对象进行操作,就要注意线程安全问题,加锁进行预防,比如用NSLock等方法.

17.// 友盟上面经常统计到 self.navigationController.viewControllers 是个null,原因是 本界面导致循环引用,以至于依然被subscribe,所以本界面经过多次pop,push的话,subscribe会被触发多次

// 避免方法,1 严格遵循@weakify(self); @strongify(self); 保证本界面不会循环引用 2 subscribe 块语句里面对外部实例的引用都用 self. 禁止用 下划线 "_" 3 subscribe 前面加上生命周期 takeUntil:self.rac_willDeallocSignal

// 遵循上述1、2、3条,就可以保证本见面被pop掉,subscribe被停止

18.当一个控件的布局始终显示错位的时候,一定要看一下是否有其他代码进行了约束更改.

19.当一个appA需要跳转到另外一个appB的时候,进行如下操作,有安装B的时候,就跳转,没有安装B的时候就跳转到下载页面.   注意:不需要在工程中配置URL Schemes,配置是为了让别的app跳转到自己app的.同时需要在info.plist文件中增加一个LSApplicationQueriesSchemes字段,把它设置为数组类型,并配置需要跳转的协议名单,如:financial.

// 判断本地是否有理财安全助手app

NSURL *financialURL = [NSURL URLWithString:@"financial://"];

if ([[UIApplication sharedApplication] canOpenURL:financialURL]) {

// 已经安装就调起app

[[UIApplication sharedApplication] openURL:financialURL];

} else {

// 没有安装就跳转到下载页面

NSURL *downloadURL = [NSURL URLWithString:@"http://a.app.qq.com/o/simple.jsp?pkgname=cn.cert.financial"];

[[UIApplication sharedApplication] openURL:downloadURL];

}

20.修改状态栏背景颜色的方法

UIView *statusbar = [[UIApplication sharedApplication] valueForKey:@"statusBar"];

statusbar.backgroundColor= [UIColor redColor];

statusbar.tintColor = [UIColor greenColor];

隐藏状态栏:  [[UIApplication sharedApplication] setValue:nil forKey:@"statusBar"];

21.所有的model属性,如果是BOOL类型,最好都用NSInteger来代替,防止在解归档的时候出现解析失败的问题.

22.Tips:在适配iPhone X的时候,如果alert弹框图层上面还有一层TabBar,会导致底部的安全区域也是黑色,tabbar并没有完全遮盖到底部,需要设置弹框alert的bottom在当前显示view的底部向上偏移34个距离就可以.  "make.bottom.equal(view).offset(-34);"

23.TTTAttributedLabel使用踩坑总结(2017.12.26):

如果要点击的地方不可以点击,查看是否禁用了点击手势;

设置行高用NSMutableParagraphStyle来进行设置而不是用lineSpacing;

设置文字应该用text属性而不是attributedText.

24.Swift语言开发注意:

在swift3中,编译器自动推断@objc,换句话说,它自动添加@objc

在swift4中,编译器不再自动推断,你必须显式添加@objc

还有一种更简单的方法,不必一个一个属性的添加,下面这种写法

@objcMembers

class Test {

}

25.如果Xcode中出现"if  else"等快捷输入代码块不能使用,需要重启电脑就可以,自己尝试是可以解决问题,可能是长时间不关机,倒是Xcode出现的问题.

26.如果Xcode中出现类似这样的警告,需要把这个.h,.m文件另存,然后在Xcode中删除,提交git代码记录,这个时候工程师报错的,因为删除了文件,这个时候,在删除文件所在的目录下再重新创建正确的类名文件,把代码拷贝粘贴过来,重新运行即可,并记得提交git代码记录.后续就不会再出现这样的警告了.

27.Terminal清屏快捷键-->Command + k

28.从app的文件环境中加载,如果Info.plist中设置了Fonts provided by application,字体在程序运行时会自动加载.

29.解决UITableView在iOS11及以上无限左滑的问题,在iOS11以下设备没有问题,如果在iOS11及以上设备运行,则不执行删除两个方法  https://www.jb51.net/article/145243.htm

30.Linux使用scp命令复制文件或者文件夹时,因为在终端已经登录了服务器,在服务器里查找要上传的文件当然没有了,直接在终端使用scp命令上传就好了.

cssdembp:desktop css$ scp /Users/css/desktop/icon.png root@IP:/usr/local/tomcat/apache-tomcat-8.0.47/webapps/ROOT

31.注册通知的时候,参数只能由一个,且类型是NSNotification.

[NSNotificationCenter.defaultCenter addObserver:self selector:@selector(oc_didFinishLaunchingWithOptionsNoti:) name:UIApplicationDidFinishLaunchingNotification object:nil];

- (void)oc_didFinishLaunchingWithOptionsNoti:(NSNotification*)noti

{

(UIApplication*)application = noti.object;

(NSDictionary*)launchOptions = noti.userInfo;

}

32.线程计时器能用GCD的就用GCD,GCD没有运行模式的干扰,dispatch_source_t  _timer

    //1、创建timer,放到主队列里面

    _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());

    //2、设置timer执行的时间、执行时间间隔、精确度

    dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC, 0.1 * NSEC_PER_SEC);

    //3、设置timer执行的事件

    __weaktypeof(self) weakSelf =self;

    dispatch_source_set_event_handler(_timer, ^{

        [weakSelf action];

    });

    //4、激活timer

    dispatch_resume(_timer);

    //5、取消timer

    dispatch_source_cancel(_timer);

33.待更新.

注:仍在总结补充中.

推荐阅读更多精彩内容