码迷,mamicode.com
首页 > 其他好文 > 详细

Adopting Modern Objective-C 译文

时间:2015-08-11 06:56:01      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:

 这些年来,Objective-C在不断的发展和进化。尽管最核心的概念和实践都是一直未变的,它还是在很多方面发生了巨大的改变,并取得了巨大的进步。这些改变提高了诸如类型安全,内存管理,性能等方方面面的特性,让编写Objective-C变得更加容易。为了让你现在和未来的代码变得更加健壮,可靠和更加有弹性,适应这些改变将是十分重要的事情。
     Xcode为你准备了一个适应这些结构化改变的工具。但是在你使用它之前,你会想这些改变会对你的代码做什么改变,并且为什么做这些改变。这篇文档重点讲述了要发生在你的代码上的最为重要和有用的改变。

instancetype 
     使用instancetype关键字作为类初始化方法的返回值类型。这些方法包括alloc,init和类工厂方法。
     在你的OC代码里合适的地方使用instancetype而不是id着实提高了类型安全。例如,思考下面的代码 :
 1 @interface MyObject : NSObject
 2 + (instancetype)factoryMethodA;
 3 + (id)factoryMethodB;
 4 @end
 5  
 6 @implementation MyObject
 7 + (instancetype)factoryMethodA { return [[[self class] alloc] init]; }
 8 + (id)factoryMethodB { return [[[self class] alloc] init]; }
 9 @end
10  
11 void doSomething() {
12    NSUInteger x, y;
13  
14     x = [[MyObject factoryMethodA] count]; // Return type of +factoryMethodA is taken to be "MyObject *"
15     y = [[MyObject factoryMethodB] count]; // Return type of +factoryMethodB is "id"
16 }
      因为+factoryMethodA的返回值类型是instancetype, 所以传递消息所表达的是MyObject *类型。而MyObject并没有-count这个方法,所以编译器会给出下面的警告:     
main.m: ’MyObject’ may not respond to ‘count’
     
     然而,因为+factoryMethodB的返回值类型是id类型,编译器将不会给出相应的警告。因为id类型的对象可以是任何一种类,而同时,-count方法可能会存在与某个类中,所以,对于编译器来说,+factoryMethodB的返回值是由可能去实现-count这个方法的。
 
     为了确保instancetype工厂方法拥有正确的子类表现,当在初始化类实例的时候请确保使用[self class]而不是[类名 class]。这样,才能确保编译器正确的推断出子类类型。例如,如果对上面的代码中MyObject的子类中做出下面的操作,会发生什么呢?
1 @interface MyObjectSubclass : MyObjet
2 @end
3  
4 void doSomethingElse() {
5         NSString *aString = [MyObjectSubclass factoryMethodA];
6 }
     编译器会给出以下警告: 
1 main.m: Incompatible pointer types initializing ’NSString *’ with an expression of type ’MyObjectSubclass *’

 

     

Adopting Modern Objective-C 译文

标签:

原文地址:http://www.cnblogs.com/ljh-iOS/p/Adopting-Modern-Objective-C.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!