總結iOS開發當中一些特別注意的問題

來源:互聯網
上載者:User

1. mutable的資料類型,不能聲明為copy的屬性,如@property(nonatomic, copy) NSMutableArray *array;  @property(nonatomic, copy)  NSMutableDictionary *dict;這樣的聲明,然後再初始化的時候會有問題,self.array = [[NSMutableArray alloc] init];  其實它在記憶體中是NSArray的執行個體。所以一定得是mutablecopy.

2.如果用下面代碼出現一個模態ui,這個模態ui中有UITextField或UITextView的成員,那麼會出現keyboard, 如果發送resignFirstrRsponder鍵盤是不會消失的。

    UINavigationController *nv = [[UINavigationController alloc] initWithRootViewController:searchVC];    nv.modalPresentationStyle = UIModalPresentationFormSheet;    [self presentModalViewController:nv animated:YES];

UINavigationController必須用Category的方法實現如下方法,才可以讓鍵盤消失

@interface UINavigationController (DismissKeyboard)- (BOOL)disablesAutomaticKeyboardDismissal;@end@implementation UINavigationController (DismissKeyboard)- (BOOL)disablesAutomaticKeyboardDismissal{    return NO;}@end

3.關於NSURLConnection中的delegate,下面是官網的說明:

Note: During a download the connection maintains a strong reference to the delegate. It releases that strong reference when the connection finishes loading, fails, or is canceled.

也就是說,delegate會被NSURLConnection擁有,在非arc情況下,下面的代碼也可以

//creates the handler objectMyHandlerClass *handler = [[MyHandlerClass alloc] init]; //creates the connection with handler as an autorelease object[[NSURLConnection alloc] initWithRequest:request delegate:[handler autorelease]];或//creates the handler objectMyHandlerClass *handler = [[MyHandlerClass alloc] init]; //creates the connection with handler[[NSURLConnection alloc] initWithRequest:request delegate:handler]; //releases handler object[handler release];

MyHandlerClass中NSURLConnection的回調方法也會解發。

在arc情況下代碼如下:

//creates the handler objectMyHandlerClass *handler = [[MyHandlerClass alloc] init]; //creates the connection with handler[[NSURLConnection alloc] initWithRequest:request delegate:handler];

4. static library中如果用了category, 那麼在引用庫的時候在other Link中加入-all_load 或 -force_load參考

5. 如果項目工程中有c/c++的源碼,那麼在編寫項目Prefix.pch的時候一定得注意,如果下面這樣寫,編譯會出錯:

#ifdef __OBJC__    #import <UIKit/UIKit.h>    #import <Foundation/Foundation.h>#endif#import "AppDelegate.h"

修改方法為如下就正確了:

#ifdef __OBJC__    #import <UIKit/UIKit.h>    #import <Foundation/Foundation.h>#import "AppDelegate.h"#endif

因為這是一個先行編譯標頭檔,是全域的,所有源檔案對其都是可見的,所以在c/c++源碼中也會引入,在c/c++源碼中引用objective_c的源碼就會出錯。

6. UIView 的addSubview:b方法,如果參數b是同一個指標,那麼無論調用多少次,它的subview中只有一個b對象。 測試環境是iOS6, 記得iOS3好像沒有這個限制。

7. NSNumber能表示的數字整數部份精度只有15位,其實是double的精度。如果需要更高的精度,請用NSDecimalNumber。

8. UITableView相關:

a.不要在- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath方法中調用

- (NSIndexPath *)indexPathForCell:(UITableViewCell *)cell,會引起迴圈調用。

9. 發送crash log 到郵箱

void uncaughtExceptionHandler(NSException *exception) {    NSLog(@"CRASH: %@", exception);    NSLog(@"Stack Trace: %@", [exception callStackSymbols]);    // Internal or email error reporting}- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);    // Normal launch stuff}

10.加MKAnnotation到MKMapView的時候,MKAnnotation的coord取值範圍應是(-180, 180),  如果超出這個範圍, 將不能加成功。將不影響MKMapView中數組annotations的個數。

11.用數組的時候一定要先check index是否超出數組大小,否則很容易crash.

12. 聲明delegate請用weak類型,否則很容易memory leak.

13. 不要用NSManagedObject對像做為Model數庫,即使資料結構一樣的,也不要這樣做。比如UI A顯示查詢出來的結果, UI B裡delete了資料庫,那回到UI A就悲劇了。

14. CFTypeRef是沒有ARC的概念,所以需要自己管理記憶體。在一個方法中返回一個CFTypeRef一定要注意在外面釋放記憶體,不然有記憶體leak.解決方案有兩種,一是在方法面面release返回的CFTypeRef, 二是將方法返回的值改為ObjC的類型,這樣就可以支援auto release.

15.在category方法中實現私人方法如- (void)viewDidAppear:(BOOL)animated,  然後在pushViewController
做動畫的時候會出現Unbalanced calls to begin/end appearance transitions的錯誤

16.系統在做動畫的時候盡量不要對UIWindow的subview進行操作。本人在pushViewController:vc的時候,在vc的viewDidLoad中對HUD進行了show/hide/show 操作,結果HUD不顯示。

17.在UITableViewController這類開發中,UITableView的UITableViewDelegate與UITableViewDataSource要用單獨的類來實現,這樣可以減輕viewController的負擔。UIViewController中是處理訊息事件。在UITableView的UITableViewDataSource中千萬不要指定第一行顯示什麼,第二行顯示什麼,要用資料來源控制該顯示什麼,也就是說應跟據資料來源的類型來顯示。

18.重用機制一定要小心,比如UITableViewCell就可能是重用機制,所以在用UITableViewCell的時候,一定要恢複初始化再用。

19.不用的代碼應毫不猶豫的刪掉。

20.如果項目依賴兩個庫,一個需要在Other Link Flags加-ObjC, 別一個是C/C++的庫,則不需要加,那麼就需要加一個-licucore來解決問題。

21.資料注意安全,無論存在NSUserDefault或SQLite中,都需要加密,否則就是明文。NSUserDefault其實就是一個plist檔案,如果在模擬器上運行則路徑是:~/Library/Application Support/iPhone
Simulator/4.2/Applications/<APP_ID>/Library/Preferences 如果是真機運行,用itunes備份後則路徑是:~/Library/Application Support/MobileSync/Backup/<DEVICE_ID> where <DEVICE_ID>   SQLite則在Document目錄下.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.