2014-02-27 53 views

回答

5

auto在目標C選自C繼承和裝置auto keyword

定義一個局部變量爲具有本地壽命。

關鍵字auto使用以下語法:

[auto] data-definition;由於本地生存期是本地 變量的默認值,因此極少使用auto關鍵字。

注:GNU C擴展自動關鍵字以允許嵌套函數的前向聲明 。

如果您正在尋找等效C++ 11的auto或的var C# - 在目標C id使用。

id a = [NSString new]; 
id b = [NSNumber new]; 

id在C++ 11做編譯時像auto下不了決心的具體類型。

instancetype是一個上下文關鍵字,可用作結果類型來指示方法返回相關的結果類型。例如:

@interface Person 
+ (instancetype)personWithName:(NSString *)name; 
@end 

instancetype,不像ID,只能被用作在方法聲明的結果類型。

通過instancetype,編譯器將正確地推斷出+ personWithName:的結果是一個Person的實例。並會產生一個錯誤,如果你嘗試調用

[[Person personWithName:@"Some Name"] methodThatNotExistsInPerson]; 

如果要使用id編譯器將不這樣做,你就不會修復它,並會收到運行時錯誤!

Instancetype用於多一點「強類型」添加到目標C.

0

如果你的意思是auto他們是不相關的。

  • auto是一個C99存儲類。存儲類定義變量和函數的範圍和可見性。 auto是沒有說明符的局部變量的默認值。其他的是extern,register,static。 Objective-C也有__block,而C11有_Thread_local
  • instancetype指示返回類型是 的一個實例,包含 接收類。它可以從Objective-C方法返回,但不能作爲參數傳遞。如果使用它而不是id,LLVM將檢測不同類型之間的錯誤分配。在構造函數和靜態初始化器中使用它。

接收類是一個更好的詞,因爲子類不需要重新定義instancetype它返回的子類型。

+0

抱歉,這是不正確的,它不是「封閉班級」,而是「接收班級」 - 區分是關鍵。 – CRD

0

如前所述被別人auto是一個很少使用的關鍵字,忘掉它。

instancetype是一個最近的介紹,它允許方法遵循init模式。在以init開頭的Objective-C方法中,返回類型爲的對象的接收類 - 換句話說,該方法內的self類型。據說init方法具有相關結果類型。試想一下:

@interface A : NSObject 

- (id) initWithString:(NSString *)text; 

@end 

@interface B : A 

@end 

那麼對於表達:

[[A alloc] initWithString:@"An instance of A"] 

編譯器知道結果的類型爲A *,而不是申報initWithString:因爲initX方法有一個相關的結果類型不太具體id

進一步用於表達:

[[B alloc] initWithString:@"An instance of B"] 

編譯器知道所述結果的類型是B *彷彿調用的方法來自A類(通過繼承)它被稱爲上的B一個實例。

instancetype的介紹允許其他方法聲明它們遵循此模式,從而爲編譯器提供更精確的類型信息 - 例如,它可以用來解析屬性引用。試想一下:

@interface A : NSObject 

// returns an instance of A or whatever subtype of A it is called on 
+ (instancetype) locateWithString:(NSString *)text; 

@end 

@interface B : A 

@property NSInteger size; 

@end 

的爲表達式:

[B locateWithString:@"An instance of B"].size 

編譯器知道locateWithString:返回B *,因此有一個屬性size。在instancetype之前,必須使用id類型,並且id類型沒有屬性size,因此編譯器會產生錯誤。

相關問題