在文檔中有NSAutoreleasePool的addObject:方法。是否可以將對象添加到特定的自動釋放池?
我想到這個問題:
的NSString * myString的= [[NSString的頁頭]方法initWithCString: 「這是否工作」]; [thePool addObject:myString]; [anotherPool addObject:myString];
這可能嗎?我總是讀到,我只能將對象添加到autorelease池堆棧的最頂層。
在文檔中有NSAutoreleasePool的addObject:方法。是否可以將對象添加到特定的自動釋放池?
我想到這個問題:
的NSString * myString的= [[NSString的頁頭]方法initWithCString: 「這是否工作」]; [thePool addObject:myString]; [anotherPool addObject:myString];
這可能嗎?我總是讀到,我只能將對象添加到autorelease池堆棧的最頂層。
你在做什麼是可能的,但可能會在運行時導致異常,因爲myString將在釋放後發送-release
消息(假定最後一個引用是由第一個池引用)。通常,如-[NSAutoreleasePool addObject:]
documentation所述,您不應該手動將對象添加到自動釋放池,而是通過在該對象上調用-autorelease
。這會將對象置於當前線程的活動自動釋放池中(每個線程都有自己的自動釋放池)。
是的,你可以。但你永遠不應該。完全沒有理由這樣做。
我現在感到有點困惑,因爲這從蘋果:
當一個對象被自動釋放 - 即 是,當一個對象被髮送的 自動釋放消息或當它 爲傳遞 addObject:class方法的參數 - 始終將 放置在棧頂部的頂部 的autorelease池中。
另一方面,他們沒有在NSAutoreleasePool類參考中提到它。所以我猜想,即使當我調用addObject:在特定的一個上時,它也會進入Autorelease Pool Stack之上。其實我必須嘗試一下;)
看來你有很多與內存管理有關的問題。我認爲這會大大有利於您仔細閱讀「內存管理編程指南」(http://developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html)。所有你的問題的答案都在那裏。祝你好運。 – 2009-04-28 20:08:33
我讀過兩遍。但不幸的是,我不明白他們試圖解釋他們的方式。 – Thanks 2009-04-29 07:56:31