(轉自https://github.com/oa414/objc-zen-book-cn 禪與 Objective-C 編程藝術 )
使用字面值來創(chuàng)建不可變的NSString,NSDictionary,NSArray, 和NSNumber對象。注意不要將nil傳進NSArray和NSDictionary里,因為這樣會導致崩潰。
例子:
NSArray*names = @[@"Brian",@"Matt",@"Chris",@"Alex",@"Steve",@"Paul"];NSDictionary*productManagers = @{@"iPhone":@"Kate",@"iPad":@"Kamal",@"Mobile Web":@"Bill"};NSNumber*shouldUseLiterals = @YES;NSNumber*buildingZIPCode = @10018;
不要這樣:
NSArray*names = [NSArrayarrayWithObjects:@"Brian",@"Matt",@"Chris",@"Alex",@"Steve",@"Paul",nil];NSDictionary*productManagers = [NSDictionarydictionaryWithObjectsAndKeys:@"Kate",@"iPhone",@"Kamal",@"iPad",@"Bill",@"Mobile Web",nil];NSNumber*shouldUseLiterals = [NSNumbernumberWithBool:YES];NSNumber*buildingZIPCode = [NSNumbernumberWithInteger:10018];
如果要用到這些類的可變副本,我們推薦使用NSMutableArray,NSMutableString這樣的類。
應該避免下面這樣:
NSMutableArray*aMutableArray = [@[]mutableCopy];
上面這種書寫方式的效率和可讀性的都存在問題。
效率方面,一個不必要的不可變對象被創(chuàng)建后立馬被廢棄了;雖然這并不會讓你的 App 變慢(除非這個方法被頻繁調用),但是確實沒必要為了少打幾個字而這樣做。
可讀性方面,存在兩個問題:第一個問題是當你瀏覽代碼并看見@[]的時候,你首先聯(lián)想到的是NSArray實例,但是在這種情形下你需要停下來深思熟慮的檢查;另一個問題是,一些新手以他的水平看到你的代碼后可能會對這是一個可變對象還是一個不可變對象產生分歧。他/她可能不熟悉可變拷貝構造的含義(這并不是說這個知識不重要)。當然,不存在絕對的錯誤,我們只是討論代碼的可用性(包括可讀性)。