說明
里面包含了「最佳實踐」和「不要踩的坑」,這個可以一定程度上提高開發效率,避免一些低級錯誤。比如以 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];