看到很剛開始開發iPhone軟體的朋友問很多問題,其實同樣的問題我也碰到過, 所以抽時間把能想到的或者碰到的問題匯總一下, 一來可以給自己做個備忘也可以和朋友們分享探討。
1. iPhone SDK 開發能不能使用C / C++ 語言?
Answer:iPhone SDK的開發的基礎架構是基於cocoa庫的,Objective-C 是cocoa的開發語言, 但基於Objective-C的特性,在iPhone程式中可以使用C/C++進行功能開發以及使用第三方C/C++庫。
2. 如何才能使用 C /C++?
Answer: 當你需要使用C/C++時, 可以將類實現的檔案名稱改為.mm, 這樣編譯器就知道改檔案中包含C/C++代碼 (註:此時在工程屬性的編譯選項必須設定為根據檔案類型或者objective c++或者C++, 具體位置:GCC 4.0 -Language -> Compile Sources As )
3. Objective-C類屬性關鍵字nonatomic時什麼意思?
Answer: 這時Objective-C的特性, 改關鍵字用來告訴編譯器在自動產生訪問器代碼時該如何處理安全執行緒。預設情況下所有屬性都是atomic也就是安全執行緒的,但因為運行效率較低。考慮到效率,一般都採用nonatomic,然後自己做安全執行緒的處理。
4. 如何避免因為記憶體不足導致程式崩潰?
Answer: iPhone程式可用的記憶體很小, 蘋果官方沒有給出明確的上限, 但根據互連網上其它開發人員的總結最多不超過20MB,這一數字未經證實,但我曾碰到過程式在分配13Mb記憶體的時候就頻頻crash情況。 所以, 要想避免由於記憶體不足導致的不穩定,還是按照蘋果的建議
Load resources lazily, 就是所有資源都是在使用的時候再載入,用完立刻釋放。 比如,你的程式需要3張圖片在某個View中顯示,以往的傳統型程式的做法是在程式啟動的時候載入該3張圖片到記憶體, 用的時候直接調用記憶體以提高效率。 但這樣的做法在iPhone中不可取,iPhone對於資源的原則是隨用隨取,用完釋放。
對象的分配也盡量避免使用autorelease,善用NSAutoreleasePool 記憶體池。尤其是在迴圈中。
大資料量採用SQLite儲存, 儲存快、效率高
絕對避免記憶體泄露,iPhone程式崩潰往往是擁有記憶體泄露導致,可以使用xcode->Run->Start With Performance Tool -> Leaks 來檢查泄露情況
5. 如何儲存程式中的使用者輸入資訊?
Answer: 有時候需要儲存使用者輸入的資訊資料或者程式的狀態,最好的方式是採用plist儲存。 用plist儲存優點甚多,NSArray、NSDictionary等容器類都支援直接輸入輸出plist格式的檔案。 但需要注意的是, 輸入、輸出的檔案格式和相應容器類要保持一致。 也就是說,使用[array writeToFile] 輸出的plist檔案必須用[array arrayWithContentsOfFile:]來讀取,如果混用了array和dictionary則會導致程式崩潰。
6. 如何彈出網路連結對話方塊?
Answer: 如果程式中用到網路,按照app store的規定需要彈出網路連接對話方塊提示使用者。只需要在Info.plist檔案中添加信的條目:UIRequiresPersistentWiFi 類型為Boolean,值為YES即可。
7. 如何顯示頂部狀態列中的網路忙指標?
Answer: 設定networkActivityIndicatorVisible = YES即可, 不需要時將其賦值NO即可
8. 如何在程式表徵圖上顯示數字?
Answer: 在程式退出或者改變時修改[UIApplication sharedApplication].applicationIconBadgeNumber的值即可
9. 如何比較兩個NSString字串是否一樣?
Answer: 使用NSString類的isEqualToString: 方法來判斷字串是否相同,也可以使用[NSStringObject compare:]==NSSameOrder, 注意:isEqual用於判斷兩個對象是否一樣而不是內容
10. 如何改變導航條的背景顏色?
Answer: 如果時在ViewController中修改則使用類似如下代碼:
self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0.03 green:0.215 blue: 0.298 alpha:1];