從forum discussion,看起來最大的區別就是性能因子,allocWithZone:將從特定的內存區域分配內存,從而降低交換成本。alloc和allocWithZone有什麼區別:?
實際上,幾乎沒有機會使用allocWithZone:,任何人都可以舉一個簡單的例子來說明使用allocWithZone的情況:?
感謝,
從forum discussion,看起來最大的區別就是性能因子,allocWithZone:將從特定的內存區域分配內存,從而降低交換成本。alloc和allocWithZone有什麼區別:?
實際上,幾乎沒有機會使用allocWithZone:,任何人都可以舉一個簡單的例子來說明使用allocWithZone的情況:?
感謝,
當一個對象創建另一個,這是 有時一個好主意,以確保 他們都來自相同的內存 區域分配。區域方法 (在NSObject協議中聲明) 可用於此目的;它 返回接收者所在的區域,該區域位於 。
這表明,我認爲你的實例變量,任何對象的類「創造」自己可以利用的+allocWithZone:
以這種方式,使他們在同一個區域中創建的實例。
-(id)init {
if (self = [super init]) {
someIvar = [[SomeOtherClass allocWithZone:[self zone]] init];
}
return self;
}
是的,這是一個使用allocWithZone的好例子: – Forrest 2010-12-23 02:49:04
使用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實際使用的唯一的地方。
我使用allocWithZone
單身人士。正如Forrest所述,創建的變量是從同一個內存區域分配的。因此其他類可以使用或從同一個內存區訪問它們。運行應用程序時節省內存空間。
從蘋果公司的documentation:
這種方法存在的歷史原因;內存區域不再是Objective-C使用的 。
在Foundation Functions Reference,所有的Zone
功能現在前綴爲低於警告區將被忽略。
OS X上的iOS和64位運行時會忽略區域。您不應在當前開發中使用區域。
NSCreateZone
NSRecycleZone
NSSetZoneName
NSZoneCalloc
NSZoneFree
NSZoneFromPointer
NSZoneMalloc
NSZoneName
NSZoneRealloc
NSDefaultMallocZone
即使蘋果的文檔表明allocWithZone:
存在歷史原因;內存區不再被Objective-C使用。您不應該重寫此方法。
和
區是iOS上的忽略,在OS X上的64位運行時你不應該在當前的開發利用區。
在現實中我重寫它在Objective-C類(在全Objective-C的項目),當我做[[Mylass alloc] init]
即使構建的是iPhone 6S運行方法被調用。
但我認爲最好按照文檔並覆蓋alloc
方法而不是這個方法,因爲alloc可以做同樣的工作。
請注意,目前的(2014年)Apple文檔說`zone`參數被忽略,並且「此方法存在歷史原因;內存區域不再由Objective-C使用。」所以接受的答案可能不再是正確的答案。 – 2014-03-13 14:05:19