天天看點

iOS6下Objective-C最新特性

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 { ... }
@end
           

2.枚舉支援強類型

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
@end
           

4.建立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 MyClass
static 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;
}
           

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;
}
           

繼續閱讀