【iOS開發】iOS開發教訓及最佳實踐(一)

說明
里面包含了「最佳實踐」和「不要踩的坑」,這個可以一定程度上提高開發效率,避免一些低級錯誤。比如以 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];
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 在iOS中隨處都可以看到絢麗的動畫效果,實現這些動畫的過程并不復雜,今天將帶大家一窺iOS動畫全貌。在這里你可以看...
    F麥子閱讀 5,143評論 5 13
  • 在iOS中隨處都可以看到絢麗的動畫效果,實現這些動畫的過程并不復雜,今天將帶大家一窺ios動畫全貌。在這里你可以看...
    每天刷兩次牙閱讀 8,572評論 6 30
  • 導示語:縱觀皮草行業,我們可以看到,皮草行業最集中的變化階段在于危機之后,而在危機之后行業進入平穩期后,又進入幾乎...
    皮樂樂閱讀 122評論 0 0
  • 昨天看了《王牌對王牌》,朱茵重飾當年的紫霞,薛之謙飾演至尊寶,勾起了我回看的欲望。對于臺上兩人,我覺得朱茵真的還...
    栗小姐的閱讀 328評論 0 1
  • 棧就像超市里疊在一起的一箱箱牛奶。棧是一種疊在一起的形態。你遠看它是一個整體,但是其實它分很多層。既然有分層,那全...
    陳東Growth閱讀 241評論 0 0