爲什麼在使用Objective-C之前不需要初始化一些對象? 例如,爲什麼這是NSDate *today = [NSDate date];
合法?爲什麼在使用objective-c之前不需要初始化一些對象?
回答
它們在date
方法中初始化。這是在Objective-C中創建自動釋放對象的常用方法。這種形式的分配者稱爲便利分配者。
要詳細瞭解,請閱讀蘋果的可可核心能力文檔中關於創建對象的「工廠方法」的段落:http://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/ObjectCreation.html
要創造便利分配給你自己的類,實現一個類的方法,你的類的名字命名(沒有前綴)。例如: -
@implementation MYThing
...
+ (id)thing
{
return [[[MYThing alloc] init] autorelease];
}
...
@end
我怎樣才能知道什麼時候可以用這種方式使用類?謝謝。 – lampShade 2011-05-13 13:19:10
基本上,您可以通過查看方法聲明中的方法名稱和「+」號找到方便的分配器。名稱通常是沒有前綴的類名,加號表示它是一個類方法。蘋果公司爲他們提供了許多課程。一些突出的例子:[NSString stringWithFormat:],[NSNumber numberWithInt:],... – 2011-05-13 13:26:48
約定是名稱不以「alloc」,「new」,「copy」或「mutableCopy」開頭的方法返回自動釋放對象 – albertamg 2011-05-13 13:28:14
today
是靜態日期調用內部初始化(和自動釋放)。
您只需通過調用alloc
就您已分配的對象調用init…
方法。 alloc
只保留對象所需的空間,創建一個單元化的對象。
未初始化的對象將所有實例變量設置爲零,零或等效類型。除了保留計數設置爲1.
返回對象的所有其他方法都保證返回完全初始化的對象。 alloc
是例外。
您絕不可以對已經初始化的對象調用init…
方法。簡單的規則是使用alloc
- init…
之間的1對1關係,就是這樣。
兩部分。
首先,正如其他人所提到的,一個方法可以在返回對象之前初始化並自動釋放對象。這是部分這裏發生了什麼。
另一部分是它是如何定義的。請注意大多數Objective C定義是如何以-
開頭的?你提到的那個沒有。簽名是這樣的:
+ (NSDate*) date;
也就是說,這是一個類方法,適用於該類作爲一個整體,而不是這個類的一個實例。
- 1. 需要初始化對象
- 2. 這些對象初始化之間有什麼不同?
- 3. 爲什麼我需要初始化?
- 4. 爲什麼python在應用方法之前需要初始化列表?
- 5. 爲什麼不需要使用「新」來初始化std :: vector?
- 6. 爲什麼字符串需要用初始值初始化?
- 7. 什麼時候需要在java中初始化一個對象,什麼時候不需要?
- 8. 爲什麼使用as關鍵字初始化一個對象
- 9. 對象正在初始化爲不需要的值
- 10. 爲什麼Swift中的類初始化期間不需要所有對象?
- 11. 爲什麼我需要初始化一個int變量爲0?
- 12. 爲什麼在使用eval之前需要本地化$ @?
- 13. 爲什麼在使用new關鍵字初始化Float對象時,您不需要爲f後綴1.0呢?
- 14. 初始化一個字符串,爲什麼需要`@`?
- 15. C# - 爲什麼我需要初始化一個[out]參數
- 16. 爲什麼統一初始化語法僅適用於對象?
- 17. 爲什麼不需要重新分配一些對象?
- 18. 爲什麼我不能用對象初始化這個NSArray?
- 19. 在C++初始化之前聲明一個對象
- 20. 在if語句之前初始化一個對象
- 21. 爲什麼對象未被初始化全局使用Java?
- 22. 爲什麼使用double&not工作初始化對象方法?
- 23. 爲什麼初始化一個對象爲空
- 24. 爲什麼不能使用String來初始化一個StringBuilder對象?
- 25. 爲什麼需要在堆上初始化一個對象而不是在堆棧上的指針?
- 26. NullReferenceException - 不知道爲什麼初始化對象重置爲空
- 27. Swift:Constant''在被初始化之前使用
- 28. 爲什麼C++初始化列表在大括號之前?
- 29. 爲什麼抽象派生類需要初始化一個虛擬基類?
- 30. 爲什麼我需要初始化varible類時,我想用它
另請參閱這個最近的問題:http://stackoverflow.com/questions/5987969/objective-c-self-allocating-objects/5988016 – 2011-05-13 17:35:33