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目錄下.