[iOS]那些年,遇到的坑

我做 iOS App 开发有几年了(全栈是我本体),从看别人代码到使用别人代码,再到自己写代码,码农的气息从未减少。之前看过一篇文章,说的是程序员不配叫工程师,因为这样破坏了工程的一个悠久的历史传统——为公众利益而设计和建造的基础设施,看来我还是老老实实做回码农吧。

性能问题

  • 获取是否允许系统定位

    估计很多小伙伴们一开始都不怎么在意是否需要加变量来存这个 BOOL 值,直接使用以下这种方式进行判断:

    1
    2
    3
    4
    // objc
    if([CLLocationManager locationServicesEnabled]&&[CLLocationManager authorizationStatus] != kCLAuthorizationStatusDenied){
    // code here
    }

    这样简单快捷,不用额外增加变量,在一次开销的情况下,这样做是没啥大问题,但在多次使用的情况下,这就会带来性能上问题,因为其读取速度有些慢,在多次操作下就会变得异常的慢。所以有多次开销的情况,建议使用变量来存储该值,再使用其变量去操作,避免不必要的系统开销。

    1
    BOOL isLocationOn = [CLLocationManager locationServicesEnabled]&&[CLLocationManager authorizationStatus] != kCLAuthorizationStatusDenied;

多语言问题

  • 货币的处理

    当我们要格式化一些数据时,必然会使用到 NSNumberFormatter ,例如我们想格式化数字为123,12.00 这样的格式时,就会使用以下的代码:

    1
    2
    3
    4
    NSNumberFormatter *format = [NSNumberFormatter new];
    [format setPositiveFormat:@"#,###.##"];

    NSString *result = [format stringFromNumber:[NSNumber numberWithDouble:2015.01]];

    理想的情况下,这样就满足了我们的需要,但事实上我们需要的是 123,12.01 这样的结果,在中文系统的情况下我们是会得到我们想要的结果,但切换了系统语言时,就会看到杯具的事情发生了。那个格式化的结果变了,变成其它语言的习惯,不是我们想要的结果。那需要我们想要的结果时,那就得设置 format 语言属性。

    1
    2
    3
    4
    5
     NSNumberFormatter *format = [NSNumberFormatter new];
    [format setPositiveFormat:@"#,###.##"];
    [format setLocal:[[NSLocal alloc] initWithLocaleIdentifier:@"zh"]];

    NSString *result = [format stringFromNumber:[NSNumber numberWithDouble:2015.01]];
  • 时间处理

    时间的格式化也会有类似货币那种情况,在 NSDateFormatter 时设置我们需要的语言区域。

    1
    2
    3
    4
    NSDateFormatter *format = [NSDateFormatter new];
    // 设置成自己需要固定的语言区
    [format setLocale:[NSLocale localeWithLocaleIdentifier:@"en"]];

    例如我们需要得到月份,中文:7、英文:July, 那格式化字符串对应为:MMMMMM,理想的情况下自然可以得到正确的结果(前提是在英文的系统下),但系统式中文时,就得不到那样的结果,针对这种情况,就需要设置 format 的地区,固定其语言区域,避免出现意想不到的结果。