采用现代Objective-C (3)

Enumeration Macros

NS_ENUM和NS_OPTIONS宏提供一个简洁、简单的定义枚举的方法和基于c语言的选项。这些宏在Xcode中实现可以显式地指定枚举类型和选项的大小。此外,这种由旧的编译器语法声明枚举的方式,可以被新的编译器正确评估和解释潜在的类型信息。


使用NS_ENUM宏定义枚举,互斥的一组值:

    typedef NS_ENUM(NSInteger, UITableViewCellStyle){
            UITableViewCellStyleDefault,
            UITableViewCellStyleValue1,
            UITableViewCellStyleValue2,
            UITableViewCellStyleSubtitle
    }

NS_ENUM宏帮助定义枚举的名称和类型,在本例中名称为UITableViewCellStyle类型为NSInteger。枚举类型应该是NSInteger。


使用NS_OPTIONS宏来定义选项,一组位掩码值,可以组合在一起:

    typedef NS_OPTIONS(NSUInteger, UIViewAutoresizeing){
            UIViewAutoresizeingNone                    = 0,
            UIViewAutoresizeingFlexibleLeftMargin      = 1 << 0,
            UIViewAutoresizeingFlexibleWidth           = 1 << 1,
            UIViewAutoresizeingFlexibleRightMargin     = 1 << 2,
            UIViewAutoresizeingFlexibleTopMargin       = 1 << 3,
            UIViewAutoresizeingFlexibleHeight          = 1 << 4,
            UIViewAutoresizeingFlexibleBottomMargin    = 1 << 5
    }

像这样的枚举,NS_OPTIONS宏定义一个名称和一个类型。然而,通常类型应该是NSUInteger。

怎样适配

代替你的枚举声明,如:

    enum{
            UITableViewCellStyleDefault,
            UITableViewCellStyleValue1,
            UITableViewCellStyleValue2,
            UITableViewCellStyleSubtitle
    };
    typedef NSInteger UITableViewCellStyle;

用NS_ENUM语法:

    typedef NS_ENUM(NSInteger, UITableViewCellStyle){
            UITableViewCellStyleDefault,
            UITableViewCellStyleValue1,
            UITableViewCellStyleValue2,
            UITableViewCellStyleSubtitle
    }

但是,当你使用enum去定义一个位掩码,像这样:

    enum {
            UIViewAutoresizeingNone                    = 0,
            UIViewAutoresizeingFlexibleLeftMargin      = 1 << 0,
            UIViewAutoresizeingFlexibleWidth           = 1 << 1,
            UIViewAutoresizeingFlexibleRightMargin     = 1 << 2,
            UIViewAutoresizeingFlexibleTopMargin       = 1 << 3,
            UIViewAutoresizeingFlexibleHeight          = 1 << 4,
            UIViewAutoresizeingFlexibleBottomMargin    = 1 << 5
    };
    typedef NSUInteger UIViewAutoresizing;

用NS_OPTIONS宏:

    typedef NS_OPTIONS(NSUInteger, UIViewAutoresizeing){
            UIViewAutoresizeingNone                    = 0,
            UIViewAutoresizeingFlexibleLeftMargin      = 1 << 0,
            UIViewAutoresizeingFlexibleWidth           = 1 << 1,
            UIViewAutoresizeingFlexibleRightMargin     = 1 << 2,
            UIViewAutoresizeingFlexibleTopMargin       = 1 << 3,
            UIViewAutoresizeingFlexibleHeight          = 1 << 4,
            UIViewAutoresizeingFlexibleBottomMargin    = 1 << 5
    }

或者,您可以在Xcode使用现代objective-c变换器自动进行转换您的代码。更多信息请看使用Xcode重构你的代码。

Automatic Reference Counting (ARC)

自动引用计数(ARC)是一个编译器特性,它提供了Objective-C对象的自动内存管理。代替你不必记得使用retain,release和autorelease。ARC评估对象的生命周期需求并自动插入适当的内存管理要求在编译时间。编译器也会为你产生适当的dealloc方法。

怎样适配

Xcode提供了一个工具,自动化转换的(如删除retain和release调用)帮助你解决不能自动修复的问题。使用ARC工具:选择Edit > Refactor > Convert to Objective-C ARC。这个工具转换项目中所有的文件使用ARC。


更多的信息,看Transitioning to ARC Release Notes.

Refactoring Your Code Using Xcode

Xcode提供了一个现代objective - c变换器,在转向现代化过程中可以帮助你。虽然转换器有助于识别和潜在应用现代化的机制,但它没有解释代码的语义。例如,它不会发现-toggle方法是一种动作,影响你的对象的状态,并将错误地提供现代化这一行动是一个属性。确保手动审查和确认任何转换器提供的使您的代码的更改。


前面描述的现代化,转换器提供了:

  • 改变id到instancetype在合适的地方
  • 改变enum到NS_ENUM或NS_OPTIONS
  • 更新到@property语法

除了这些现代化,这个转换器推荐额外的代码变更,包括:

  • 转换到字面意思,像[NSNumber numberWithInt:3]变成@3.
  • 用下标,像[dictionary setObject:@3 forKey:key]变成dictionary[key] = @3.

使用modern Objective-C converter,Edit > Refactor > Convert to Modern Objective-C Syntax.

你可能感兴趣的:(采用现代Objective-C (3))