-[NSArray firstObject]可能是Objective-C中被调用做多的API。在Open Radar上一个简单的调查显示有一些需求苹果已经做了记录。好消息是现在这些需求已经得到了解决。. firstObject的使用可以追溯到iOS4.0,但是那时仅仅是一个私有方法。在iOS7以前,工程师用下面的方式来使用它:
Crayon Syntax Highlighter v2.7.1
NSArray *arr = @[];
id item = [arr firstObject];
// 在之前你需要做以下工作
id item = [arr count] > 0 ? arr[0] : nil;
1
2
3
4
5
NSArray *arr = @[];
id item = [arr firstObject];
// 在之前你需要做以下工作
id item = [arr count] > 0 ? arr[0] : nil;
[Format Time: 0.0012 seconds]
因为上面的方式很平常,有些人将它作为一个类增加到NSArray中,然后创建他们自己的firstObject方法。
这个方法的问题是这个方法的名字必须是唯一的,否则的话这个方法所引发的问题无法预估。
请确保检查你是否有任何自定义的代码在NSArray上实现了firstObject,如果有的话看看它是否是必须的,不是必须的话就把它全部移除。
六、增加了instancetype
instancetype让iOS7API变得更加难懂。苹果改变了大部分 initializer和简易构造函数(convenience constructors),用instancetype代替id作返回类型。但是这个instancetype是什么呢?
instancetype用来在声明一个方法时告诉编译器其返回类型,它表示返回调用该方法的类的对象。
这比之前返回id的通常做法要好,编译器可以对返回类型做一些检查,如果出现错误,在编译时就能提醒你,而不是在程序运行时发生崩溃。
同时,在调用子类方法时,使用它还可以省去对返回值的强制类型转换,编译器能够正确推断方法的返回值类型。
要说到instancetaype的缺点和优点吗?基本上,在任何可能的情况下都可以使用它。
七、设置UIImage的渲染模式:UIImage.renderingMode
着色(Tint Color)是iOS7界面中的一个重大改变,你可以设置一个UIImage在渲染时是否使用当前视图的Tint Color。
UIImage新增了一个只读属性:renderingMode,对应的还有一个新增方法:imageWithRenderingMode:,它使用UIImageRenderingMode枚举值来设置图片的renderingMode属性。该枚举中包含下列值:
Crayon Syntax Highlighter v2.7.1
// 根据图片的使用环境和所处的绘图上下文自动调整渲染模式
UIImageRenderingModeAutomatic
// 始终绘制图片原始状态,不使用Tint Color
UIImageRenderingModeAlwaysOriginal
// 始终根据Tint Color绘制图片,忽略图片的颜色信息
UIImageRenderingModeAlwaysTemplate
1
2
3
4
5
6
7
8
// 根据图片的使用环境和所处的绘图上下文自动调整渲染模式
UIImageRenderingModeAutomatic
// 始终绘制图片原始状态,不使用Tint Color
UIImageRenderingModeAlwaysOriginal
// 始终根据Tint Color绘制图片,忽略图片的颜色信息
UIImageRenderingModeAlwaysTemplate
[Format Time: 0.0005 seconds]
renderingMode属性的默认值是UIImageRenderingModeAutomatic,即UIImage是否使用Tint Color取决于它显示的位置。其他情况可以看下面的图例:
以下的代码说明了使用一个既定的rendering模式创建图片是多么简单:
Crayon Syntax Highlighter v2.7.1
UIImage *img = [UIImage imageNamed:@"myimage"];
img = [img imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
1
2
3