auto
和鐺類型instancetype
有何區別?
我們必須在哪裏使用auto
以及我們必須向用戶instancetype
?「auto」和「instancetype」類型的主要區別是什麼?
回答
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.
如果你的意思是auto
他們是不相關的。
auto
是一個C99存儲類。存儲類定義變量和函數的範圍和可見性。auto
是沒有說明符的局部變量的默認值。其他的是extern
,register
,static
。 Objective-C也有__block
,而C11有_Thread_local
。instancetype
指示返回類型是的一個實例,包含接收類。它可以從Objective-C方法返回,但不能作爲參數傳遞。如果使用它而不是id
,LLVM將檢測不同類型之間的錯誤分配。在構造函數和靜態初始化器中使用它。
接收類是一個更好的詞,因爲子類不需要重新定義instancetype
它返回的子類型。
抱歉,這是不正確的,它不是「封閉班級」,而是「接收班級」 - 區分是關鍵。 – CRD
如前所述被別人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
,因此編譯器會產生錯誤。
- 1. 靜態類和單一類的主要區別是什麼
- 2. Auto Generate和Auto Increment Build Number之間的區別是什麼?
- 3. AST和JDT Java模型的主要區別是什麼?
- 4. 原始類型和包裝類之間的主要區別是什麼?
- 5. getc()vs fgetc() - 主要區別是什麼?
- 6. Cassandra中分區和列族的主要區別是什麼
- 7. (類型)值和類型(值)之間的區別是什麼?
- 8. ruby中類的類型和超類的區別是什麼?
- 9. 從函數返回時auto和decltype(auto)有什麼區別?
- 10. 「auto v = f()」和「auto && v = f()」有什麼區別?
- 11. 兩種類型的訂閱在ssrs中的主要區別是什麼
- 12. 字符數組的ESI和EBX的主要區別是什麼?
- 13. java中的Array和Hashmap之間的主要區別是什麼?
- 14. 是platform.js主要區別是什麼和聚合物webcomponent.js
- 15. Sql Server 2005和Sql Server 2008的主要區別是什麼?
- 16. CTE和TEMP表格之間的主要區別是什麼?
- 17. 框架和工具包之間的主要區別是什麼?
- 18. Java SE和Java EE之間的主要區別是什麼?
- 19. G1GC和SGen GC之間的主要區別是什麼
- 20. VB Express 2008(pro)和2010之間的主要區別是什麼?
- 21. HAML,SASS/Compass和ERB的主要區別是什麼?
- 22. C++中stdlib.h和cstdlib之間的主要區別是什麼?
- 23. HTML 4和HTML 5的主要區別是什麼?
- 24. Asp.Net webApplication和網站的主要區別是什麼?
- 25. Python和PHP之間的主要區別是什麼?
- 26. web服務和wcf的主要區別是什麼?
- 27. AsyncTask()和Handler()之間的主要區別是什麼?
- 28. C中「union」和「struct」的主要區別是什麼?
- 29. Rails 1.X和2.X之間的主要區別是什麼
- 30. List接口和Collection接口的主要區別是什麼?
不要與C++ 11'auto'關鍵字混淆,它與C'auto'關鍵字不同,只能在C++ 11上下文中使用。 – Eonil