Iya dan tidak. Anda akhirnya akan melepaskan memori string tetapi "membocorkan" objek NSAutoreleasePool ke dalam memori dengan menggunakan drain, bukan rilis jika Anda menjalankan ini di lingkungan sampah yang dikumpulkan (bukan yang dikelola memori). "Kebocoran" ini hanya membuat instance NSAutoreleasePool "tidak dapat dijangkau" seperti objek lain tanpa petunjuk kuat di bawah GC, dan objek tersebut akan dibersihkan saat GC berjalan, yang bisa jadi langsung setelah panggilan ke -drain
:
menguras
Dalam lingkungan pengumpulan sampah, memicu pengumpulan sampah jika memori yang dialokasikan sejak pengumpulan terakhir lebih besar dari ambang batas saat ini; jika tidak berperilaku sebagai rilis. ... Dalam lingkungan pengumpulan sampah, metode ini akhirnya memanggil objc_collect_if_needed
.
Jika tidak, ini mirip dengan -release
berperilaku di bawah non-GC, ya. Seperti yang dinyatakan orang lain, -release
adalah tidak ada operasi di bawah GC, jadi satu-satunya cara untuk memastikan fungsi kumpulan dengan baik di bawah GC adalah melalui -drain
, dan di -drain
bawah non-GC bekerja persis seperti di -release
bawah non-GC, dan bisa dibilang mengkomunikasikan fungsinya dengan lebih jelas sebagai baik.
Saya harus menunjukkan bahwa pernyataan Anda "apa pun yang dipanggil dengan new, alokasi, atau init" tidak boleh menyertakan "init" (tetapi harus menyertakan "copy"), karena "init" tidak mengalokasikan memori, ia hanya menyiapkan objek (konstruktor mode). Jika Anda menerima objek yang dialokasikan dan fungsi Anda hanya memanggil init seperti itu, Anda tidak akan melepaskannya:
- (void)func:(NSObject*)allocd_but_not_init
{
[allocd_but_not_init init];
}
Itu tidak menghabiskan lebih banyak memori daripada yang sudah Anda mulai (dengan asumsi init tidak membuat instance objek, tetapi Anda tidak bertanggung jawab untuk itu).