2009-09-03 32 views

回答

7

這很少見。

NSString是一個覆蓋+ alloc作爲實現細節的類的示例。如果你要檢查,你會發現+ [NSString alloc]返回類NSPlaceholderString的東西。這是字符串class cluster的實施的一部分。

你也可以重寫來分配不同的分配NSZone是默認的。或者,你可以玩NSAllocateObject這樣的技巧,用extraBytes以非零的方式提供一個動態的空間來跟隨你的ivars。例如,您可能認爲您通常最終得到的NSString的私有子類將如下所示:

@interface { 
    NSUInteger length; 
    unichar *data; 
} 

但事實並非如此。它是一個包含長度和字符數據的單塊內存。不同的NSString實例是不同大小的內存塊。這可以通過直接調用NSAllocateObject來安排。

但所有這些都是詭計和黑客。如果你重寫+ alloc,那麼特別的事情正在發生。

4

+alloc沒有什麼魔力,它只是在Objective-C運行時調用一個方法來獲取類實例的大小並分配這些內存量。編寫真正的單例時,您可能想要覆蓋+alloc(即,您要確保只能分配一個類的單個實例)。儘管在寫單體課時很少需要這麼長的時間,但你可以。一般而言,您可以覆蓋+alloc以提供替代方法(例如,不在不同區域分配內存,分配與接收類別不同的​​類別 - 這是類別集羣可能執行的操作),或者您可以調用+[super alloc]執行標準工作,然後添加您自己的定製。

1

我重寫頁頭的單實例類,例如:

#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 
+0

這通常不是一個正確的方法,因爲你誤寫了編寫'[Singleton new]'的用戶他們不會得到新的實例。事實上,該實例獲得了兩次'init'-ed而不是一次。相反,你應該公開一個'+(instancetype)sharedInstance;'類的方法。並且保護'allocWithZone:'不會保護您免受使用運行時功能實例化多個實例的用戶。 – 2015-07-24 16:21:01