基於對this question的一些回答,似乎+ alloc在Objective-C中爲一個對象的實例分配內存時會出現一些幕後魔法。是否需要重寫+ alloc?在Objective-C中是否需要類來覆蓋+ alloc?
回答
這很少見。
NSString是一個覆蓋+ alloc作爲實現細節的類的示例。如果你要檢查,你會發現+ [NSString alloc]返回類NSPlaceholderString的東西。這是字符串class cluster的實施的一部分。
你也可以重寫來分配不同的分配NSZone是默認的。或者,你可以玩NSAllocateObject這樣的技巧,用extraBytes
以非零的方式提供一個動態的空間來跟隨你的ivars。例如,您可能認爲您通常最終得到的NSString的私有子類將如下所示:
@interface {
NSUInteger length;
unichar *data;
}
但事實並非如此。它是一個包含長度和字符數據的單塊內存。不同的NSString實例是不同大小的內存塊。這可以通過直接調用NSAllocateObject來安排。
但所有這些都是詭計和黑客。如果你重寫+ alloc,那麼特別的事情正在發生。
+alloc
沒有什麼魔力,它只是在Objective-C運行時調用一個方法來獲取類實例的大小並分配這些內存量。編寫真正的單例時,您可能想要覆蓋+alloc
(即,您要確保只能分配一個類的單個實例)。儘管在寫單體課時很少需要這麼長的時間,但你可以。一般而言,您可以覆蓋+alloc
以提供替代方法(例如,不在不同區域分配內存,分配與接收類別不同的類別 - 這是類別集羣可能執行的操作),或者您可以調用+[super alloc]
執行標準工作,然後添加您自己的定製。
我重寫頁頭的單實例類,例如:
#import "Singleton.h"
static Singleton * instance;
@implementation Singleton
+ (void)initialize
{
if (!instance) {
instance = [[super allocWithZone:NULL] init];
}
}
+ (id)allocWithZone:(NSZone * const)notUsed
{
return instance;
}
@end
這通常不是一個正確的方法,因爲你誤寫了編寫'[Singleton new]'的用戶他們不會得到新的實例。事實上,該實例獲得了兩次'init'-ed而不是一次。相反,你應該公開一個'+(instancetype)sharedInstance;'類的方法。並且保護'allocWithZone:'不會保護您免受使用運行時功能實例化多個實例的用戶。 – 2015-07-24 16:21:01
- 1. 我需要spl_autoload_register來覆蓋__autoload
- 2. iphone objectiveC alloc/release問題
- 3. 我只需要覆蓋Toast類的show()
- 4. 這是否需要在alloc之前檢查對象nil?
- 5. Android AccountManager需要覆蓋AuthToken
- 6. 需要覆蓋主題CSS
- 7. 需要加強在Android MapView的覆蓋
- 8. 覆蓋無需擴展類
- 9. HtmlElement中的CssClassSet類是否需要檢查類是否存在?
- 10. 覆蓋woocommerce!重要的類
- 11. 是否需要Elasticsearch類型?
- 12. 覆蓋HashCode如果我不需要覆蓋等於
- 13. 是否有可能在WordPress中覆蓋核心類
- 14. 是否可以覆蓋NSUserDefault?
- 15. 緩存是否被覆蓋?
- 16. 類屬性是否在擴展類上被覆蓋?
- 17. 是否需要user_photos?
- 18. 訪問不需要覆蓋報告
- 19. 需要不用Wise Installer覆蓋文件
- 20. 需要幫助覆蓋kendo ui驗證
- 21. 需要覆蓋Servlet init方法
- 22. 覆蓋viewSafeAreaInsetsDidChange需要超級被調用?
- 23. 需要覆蓋幫助Createdate Salesforce實例
- 24. 需要幫助覆蓋函數QWebPage.userAgentForUrl()
- 25. Buffered Writer不需要時覆蓋文件
- 26. 需要覆蓋的webdriver的方法
- 27. 需要覆蓋的XMLWriter的方法
- 28. 需要幫助覆蓋CSS a:hover
- 29. 需要覆蓋來自asmx web服務的Http響應代碼
- 30. 是否需要lib中的類/模塊?
什麼肯說。但是......強調......這樣做非常罕見。 – bbum 2009-09-06 06:11:03