说明
里面包含了「最佳实践」和「不要踩的坑」,这个可以一定程度上提高开发效率,避免一些低级错误。比如以 iOS 为例,「不要随便使用通知」,因为通知使用起来太方便了,用得多了调试起来就会很累,而且也不好管理;「通知用完之后记得 remove observer」;不要使用containsString (如果还需要支持 iOS 7 的话)。随着时间的累积,这份守则里的内容会越来越多,也是一件挺宝贵的财富。
一、最佳实践(通用)
1、模拟数据 VS 真实数据
在开发过程中就要按照真实场景来描述数据,但是可以加一些额外的代码来显示模拟数据,但是要做好标注,方便快速查找到这些代码,如用#ifdef #endif
这样的宏来实现.
2、点位图
从开始写时就要注意占位图的问题,在需要的地方用同一种占位图来代替。
目前考虑两种方式:1.同种占位图用同一个名字 2.把同种占位图的名字写成一个宏来定义
3、时区问题
从一开始就要和后台商量好,所有与时间有关的表示都用UTC来表示,然后再根据手机的时区解析成不同的时区。避免后面麻烦。(未实践)
4、设置圆角
目前自己有两种方案:
- 方案一:自定义一个UIImageView的子类来实现圆角。优点在于可以设置阴影,而且不要考虑view的大小 ,因为会在layout时自适应
- 方案二:写一个扩展,在设置图片前先自动把图片裁剪成圆形。优点是比较省内存,但是需要确定view的大小才能设置。
5、NSAttributeString 属性的设置
在draeInRect:withAttributes或者其他需要设置string 的attribute 的地方,设置其attribute 没有起作用
考虑是否是因为 在attri
属性字典里面把key:value
弄反了,正确的应该是NSFontAttributName:[UIFont systemFontSize:],但是它又不报错,真是坑(因为都是NSString,都是即可以为key也可以是value)。
这里放一个链接,里面是所有可以设置的属性。 AttributeString 属性
6、关于view的transform 属性
transform的scale,缩放时是保持中心的位置不动的。
7、CALayer 与 UIKit 直接绘文字或图片
为什么在自定义的CALayer 里面画文字会不显示,但是在其他view的drawRect里面就可以显示。
NSString 是UIKit框架里面的内容,而CALayer 是Quartz里面的内容,不能使用UIKit 里面的方法和类,但是他为什么不报错啊,为什么啊!!!
8、UIImageView
UIImageView 在使用时不会调用 drawRect方法,系统默认。
9、Button 改变 title 时会闪
<1> 用bin.titleLable.text = @“”,再设置title。不起作用
<2> 创建时用UIButtonTypeCustom,也不起作用
<3> [UIView setAnimateionEnable:NO]; <#code#> [UIVIew setAnimationEnabled:YES] [UIVIew CommitAnimation];
第三种方法可以,但是同时其他动画也会受影响。
10.NSMutableArray、NSMutableDictionary
使用NSMutableArray 、NSMutableDictionary等时要注意,要判断你操作的对象实际上是不是这个类型Mutable类型,如果不是,则使用removeObjectForKey,removeObjectAtIndex 这样的方法会直接崩溃。因为多态的存在这种情况是可能发生的,所以要注意。
11、UIScrollView
- 对UIScrollView设置约束时要注意,他是根据你的约束来确定他自己contentView的大小,而不能由contentView的大小来决定子视图的大小。
- 如果 showsVerticalScrollIndicator showsHorizontalScrollIndicator 都在开着的话,则会多两个subview,推测可能就是两个indicator;所以在清空视图时要做判断。
12、UIView
-
- willMoveToWindow
这个方法还是比较好用的,有些时候很有用。还有willMoveToSuperView
-
- UIView
方法执行顺序:
<1>WillMoveToSuper
<2>WillMoveToWindow
<3>layoutSubViews
13、NSArray、NSDictionary
在创建这两种类型的对象时,里面object不能未赋值或为nil,不然会造成crash。注意!
14、关于resizableImageWithCapInsets
如果使用了这种图片,就不要再设置UIimageView 的contentMode,否则会造成不可预知的错误.
二、其他
1、极光推送:
推送时绑定别名时,别名不能只有数字,不然会注册失败。必须有字母(官方文档里没有说明 ,但是实践结果是这样的。)
2、关于应用中定位
前面要获取当前定位的时候,就通知在需要的地方使用地图来获取,后来觉得这种方法太麻烦而且没有必要,只是获取当前位置就要获取那么多东西。后面,就把定位的获取放在单例里面,在使用之前调用更新方法,然后再使用。
后面可以更进一步,使用KVO,调用更新之后再通过KVO来调用方法,但是是调用一次。(未实践)
也可以封装一个工具类来获取当前的位置,而不是用单例。要注意生命周期的问题。
3、改变navigationBar 的backItem 的文字 :要设置做push动作的vc里面
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]
initWithTitle:@" "
style:UIBarButtonItemStylePlain
target:nil
action:nil];