對於NSString,NSNumber,NSArray,NSDictionary使用字面語法編程
NSString *str = "Lawrence"; //優於 NSString *str = [[]NSString alloc] initWithString:@"Lawrence"]; NSNumber *one = @1; //優於 NSNumber *one = [NSNumber numberWithInteger: 1]; NSArray *array = @[@"one", @"two", @"three"]; NSDictionary *dictionary = @[@"firstKey": @"first", @"secondKey": @"second", @"thirdKey": @"third"];
數組和字典中的數值不能夠有nil值。
使用字面量語法建立出來的對象,是不可變的(immutable),若是想要可變的版本,須要拷貝一份,數組
NSMutableArray *mutableArray = [@[@1, @2, @3, @4] mutableCopy];
儘可能不用#define去定義常量,儘可能不要在頭文件中定義常量
const僅僅用來修飾右邊的變量(基本數據變量p,指針變量*p)安全
使用枚舉變量表示狀態,選項,狀態碼併發
屬性特質
1.原子性,atomic/nonatomic,原子性,在併發編程中,若是某操做具有總體性,系統其餘部分沒法查看其中間過程的臨時結果,只能看到初始值和結束值,那麼這個操做就是原子性的
經過加鎖,確保原子性。在iOS中,atomic使用會有較大的性能開銷,也不能完成確保線程安全。
2.讀/寫權限, readwrite和readonly
3.內存管理語義性能
a) assign,設置方法,只針對scalar type(如CGFloat, NSInteger等)atom
b) strong,擁有關係,爲這種屬性設置新值後,設置方法會先保留新值,並釋放舊值,而後再將新值設置上去線程
c) weak,非擁有關係,設置新值時,既不保留新值,也不釋放舊值。屬性所指對象被destroy時,屬性值也會狀況(nil out)scala
d) unsafe_unretained指針
e) copy,擁有關係,設置方法並不保留新值,而是拷貝新值。當屬性類型爲NSString時,常常使用此特性保證其封裝性。
4.方法名,getter=
很簡單,假若有一個NSMutableString,如今用他給一個retain修飾 NSString賦值,那麼只是將NSString指向了NSMutableString所指向的位置,並對NSMUtbaleString計數器加一,此時,若是對NSMutableString進行修改,也會致使NSString的值修改,原則上這是不容許的. 若是是copy修飾的NSString對象,在用NSMutableString給他賦值時,會進行深拷貝,及把內容也給拷貝了一份,二者指向不一樣的位置,即便改變了NSMutableString的值,NSString的值也不會改變.因此用copy是爲了安全,防止NSMutableString賦值給NSString時,前者修改引發後者值變化而用的.
在對象內存儘可能直接訪問實例變量,屬性訪問,self.instance,直接訪問,_instance
讀取時使用直接訪問,寫入數據是使用屬性訪問
懶加載,必須經過屬性訪問
- (Person *)person { if (!_person) { _person = [Person new]; ... } return _person; }
對象等同性,
//You need to implement -isEqual: and -hash methods for your Request class. -(BOOL)isEqualTo:(Object *)object; -(NSUInteger)hash;