Effective Objective-C 2.0學習記錄(二)

對於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= code

很簡單,假若有一個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;
相關文章
相關標籤/搜索