WWDC2012發布了iOS6,同時為Objective C帶來了一些新特性以簡化編程。下面是這些新特性,需要XCode4.4及以上版本支援:1.方法的申明順序不再要求在方法裡面可以調用在後面申明的方法,編譯器會協助尋找方法的申明,順序不再要求。如下:@interface SongPlayer : NSObject- (void)playSong:(Song *)song;@end@implementation SongPlayer- (void)playSong:(Song *)song { NSError *error; [self startAudio:&error];//XCode4.4以前會提示方法未定義,XCode4.4以後可以放心使用 ...}- (void)startAudio:(NSError **)error { ... }@end2.枚舉支援強型別XCode4.4以前定義枚舉使用如下方式,相當於定義了類型為int的枚舉類型。typedef enum { NSNumberFormatterNoStyle, NSNumberFormatterDecimalStyle, NSNumberFormatterCurrencyStyle, NSNumberFormatterPercentStyle, NSNumberFormatterScientificStyle, NSNumberFormatterSpellOutStyle} NSNumberFormatterStyle;// typedef int NSNumberFormatterStyle;XCode4.4以後可以為枚舉指明強型別,這樣在賦值時會有強型別限制(需要在Build Setting開啟Suspicious implicit conversions)。定義如下:typedef enum NSNumberFormatterStyle : NSUInteger { NSNumberFormatterNoStyle, NSNumberFormatterDecimalStyle, NSNumberFormatterCurrencyStyle, NSNumberFormatterPercentStyle, NSNumberFormatterScientificStyle, NSNumberFormatterSpellOutStyle} NSNumberFormatterStyle;或使用NS_ENUM宏來定義typedef NS_ENUM(NSUInteger, NSNumberFormatterStyle) { NSNumberFormatterNoStyle, NSNumberFormatterDecimalStyle, NSNumberFormatterCurrencyStyle, NSNumberFormatterPercentStyle, NSNumberFormatterScientificStyle, NSNumberFormatterSpellOutStyle};3.預設屬性合成@interface Person : NSObject@property(strong) NSString *name;@end@implementation Person { NSString *_name;//這句可以省略,XCode很早就可以了}@synthesize name = _name;//XCode4.4以後,這句也可以省略,XCode預設合成帶底線的成員變數@end即可以簡化為:@interface Person : NSObject@property(strong) NSString *name;//ARC開啟,否則需要自己release@end@implementation Person@end4.建立NSNumber的新文法XCode4.4以前的建立方式:NSNumber *value;value = [NSNumber numberWithChar:'X'];value = [NSNumber numberWithInt:12345];value = [NSNumber numberWithUnsignedLong:12345ul];value = [NSNumber numberWithLongLong:12345ll];value = [NSNumber numberWithFloat:123.45f];value = [NSNumber numberWithDouble:123.45];value = [NSNumber numberWithBool:YES];XCode4.4以後可簡化為:NSNumber *value;value = @'X';value = @12345;value = @12345ul;value = @12345ll;value = @123.45f;value = @123.45;value = @YES;XCode4.4以前,使用語句建立NSNumber:NSNumber *piOverSixteen = [NSNumber numberWithDouble: ( M_PI / 16 )];NSNumber *hexDigit = [NSNumber numberWithChar: "012345679ABCDEF"[i % 16]);NSNumber *usesScreenFonts = [NSNumber numberWithBool: [NSLayoutManager usesScreenFonts]];NSNumber *writingDirection = [NSNumber numberWithInt: NSWritingDirectionLeftToRight];NSString *path = [NSString stringWithUTF8String: getenv("PATH")];XCode4.4以後可以通過”()”方式建立:NSNumber *piOverSixteen = @( M_PI / 16 );NSNumber *hexDigit = @( "012345679ABCDEF"[i % 16] );NSNumber *usesScreenFonts = @( [NSLayoutManager usesScreenFonts] );NSNumber *writingDirection = @( NSWritingDirectionLeftToRight );NSString *path = @( getenv("PATH") );5.建立NSArray的新文法NSArray* array;array = @[ a, b, c ];//相當於使用下面的方式建立:id objects[] = { a, b, c };NSUInteger count = sizeof(objects)/ sizeof(id);array = [NSArray arrayWithObjects:objects count:count];6.建立NSDictionary的新文法NSDictionary *dict;dict = @{};dict = @{ k1 : o1 };dict = @{ k1 : o1, k2 : o2, k3 : o3 };//相當於如下方式:id objects[] = { o1, o2, o3 };id keys[] = { k1, k2, k3 };NSUInteger count = sizeof(objects) / sizeof(id);dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys count:count];7.mutable對象的建立,調用對象的-mutableCopy方法NSMutableArray *mutablePlanets = [@[ @"Mercury", @"Venus", @"Earth", @"Mars", @"Jupiter", @"Saturn", @"Uranus", @"Neptune"] mutableCopy];8.靜態容器物件的建立,使用+initialize方法@implementation MyClassstatic NSArray *thePlanets;+ (void)initialize { if (self == [MyClass class]) { thePlanets = @[ @"Mercury", @"Venus", @"Earth", @"Mars", @"Jupiter", @"Saturn", @"Uranus", @"Neptune" ]; }}9.可變數組新的存取方式:@implementation SongList { NSMutableArray *_songs;}- (Song *)replaceSong:(Song *)newSong atIndex:(NSUInteger)idx { Song *oldSong = _songs[idx];//使用[idx]訪問子物件 _songs[idx] = newSong;//使用[idx]設定子物件 return oldSong ;www.2cto.com}10.可變字典新的存取方式:@implementation Database { NSMutableDictionary *_storage;}- (id)replaceObject:(id)newObject forKey:(id )key { id oldObject = _storage[key];//相當於id oldObject = [_storage objectForKey:key]; _storage[key] = newObject;//相當於[_storage setObject:object forKey:key]; return oldObject;}