2010-12-23 30 views
48

forum discussion,看起來最大的區別就是性能因子,allocWithZone:將從特定的內存區域分配內存,從而降低交換成本。alloc和allocWithZone有什麼區別:?

實際上,幾乎沒有機會使用allocWithZone:,任何人都可以舉一個簡單的例子來說明使用allocWithZone的情況:?

感謝,

+7

請注意,目前的(2014年)Apple文檔說`zone`參數被忽略,並且「此方法存在歷史原因;內存區域不再由Objective-C使用。」所以接受的答案可能不再是正確的答案。 – 2014-03-13 14:05:19

回答

45

當一個對象創建另一個,這是 有時一個好主意,以確保 他們都來自相同的內存 區域分配。區域方法 (在NSObject協議中聲明) 可用於此目的;它 返回接收者所在的區域,該區域位於 。

這表明,我認爲你的實例變量,任何對象的類「創造」自己可以利用的+allocWithZone:以這種方式,使他們在同一個區域中創建的實例。

-(id)init { 
    if (self = [super init]) { 
    someIvar = [[SomeOtherClass allocWithZone:[self zone]] init]; 
    } 

    return self; 
} 
+0

是的,這是一個使用allocWithZone的好例子: – Forrest 2010-12-23 02:49:04

5

使用allocWithZone一個很好的例子:當你正在實施NSCopy協議,它允許您自定義(按價值計算深拷貝/份)對象可複製,如:

(1) ClassName *newObject = [currentObject copy]; //results in newObject being a copy of currentObject not just a reference to it 

的NSCopy協議確保你實現一種方法:

(2) -(id)copyWithZone:(NSZone *)zone; 

當複製的對象的「複製」的消息你如上發送(1)時爲「copyWithZone將消息發送到該方法(表示2)。也就是說,你不必自己做任何事情來獲得一個區域。

現在,當您將「區域」發送到此消息時,您可以使用它來確保從與原始區域相同的區域的內存中進行復制。

這可以用於像:

-(id)copyWithZone:(NSZone *)zone 
{ 
    newCopy = [[[self class]allocWithZone:zone]init]; //gets the class of this object then allocates a new object close to this one and initialises it before returning 
    return(newCopy); 
} 

這是我知道allocWithZone實際使用的唯一的地方。

2

我使用allocWithZone單身人士。正如Forrest所述,創建的變量是從同一個內存區域分配的。因此其他類可以使用或從同一個內存區訪問它們。運行應用程序時節省內存空間。

27

從蘋果公司的documentation

這種方法存在的歷史原因;內存區域不再是Objective-C使用的 。

2

Foundation Functions Reference,所有的Zone功能現在前綴爲低於警告區將被忽略。

OS X上的iOS和64位運行時會忽略區域。您不應在當前開發中使用區域。

NSCreateZone 
NSRecycleZone 
NSSetZoneName 
NSZoneCalloc 
NSZoneFree 
NSZoneFromPointer 
NSZoneMalloc 
NSZoneName 
NSZoneRealloc 
NSDefaultMallocZone 
0

即使蘋果的文檔表明allocWithZone:

存在歷史原因;內存區不再被Objective-C使用。您不應該重寫此方法。

區是iOS上的忽略,在OS X上的64位運行時你不應該在當前的開發利用區。

在現實中我重寫它在Objective-C類(在全Objective-C的項目),當我做[[Mylass alloc] init]即使構建的是iPhone 6S運行方法被調用。

但我認爲最好按照文檔並覆蓋alloc方法而不是這個方法,因爲alloc可以做同樣的工作。