ใช่และไม่. คุณจะต้องปล่อยหน่วยความจำสตริง แต่ "รั่ว" อ็อบเจ็กต์ NSAutoreleasePool ไปยังหน่วยความจำโดยใช้ท่อระบายน้ำแทนการปล่อยหากคุณรันสิ่งนี้ภายใต้สภาพแวดล้อมที่เก็บรวบรวมขยะ (ไม่ใช่หน่วยความจำที่จัดการ) "การรั่วไหล" นี้ทำให้อินสแตนซ์ของ NSAutoreleasePool "ไม่สามารถเข้าถึงได้" เหมือนกับวัตถุอื่น ๆ ที่ไม่มีตัวชี้ที่ชัดเจนภายใต้ GC และวัตถุจะถูกล้างออกในครั้งต่อไปที่ GC ทำงานซึ่งอาจเกิดขึ้นได้โดยตรงหลังจากเรียกไปที่-drain
:
ท่อระบายน้ำ
ในสภาพแวดล้อมที่รวบรวมขยะจะทริกเกอร์การรวบรวมขยะหากหน่วยความจำที่จัดสรรตั้งแต่คอลเล็กชันล่าสุดมีค่ามากกว่าเกณฑ์ปัจจุบัน มิฉะนั้นจะทำงานเป็นการปลดปล่อย ... ในสภาพแวดล้อมที่เก็บขยะในที่สุดวิธีนี้เรียกobjc_collect_if_needed
ว่า
มิฉะนั้นจะคล้ายกับการ-release
ทำงานภายใต้ไม่ใช่ GC ใช่ ตามที่คนอื่น ๆ ระบุไว้ว่า-release
เป็น no-op ภายใต้ GC ดังนั้นวิธีเดียวที่จะทำให้แน่ใจว่าพูลทำงานอย่างถูกต้องภายใต้ GC นั้นผ่าน-drain
และ-drain
ภายใต้การทำงานที่ไม่ใช่ GC จะทำงานเหมือนกับ-release
ภายใต้ GC ที่ไม่ใช่ GC และเนื้อหาจะสื่อสารการทำงานของมันได้ชัดเจนกว่า ดี.
ฉันควรชี้ให้เห็นว่าคำสั่งของคุณ "สิ่งที่เรียกด้วย new, การจัดสรรหรือการเริ่มต้น" ไม่ควรรวม "init" (แต่ควรรวมถึง "สำเนา") เนื่องจาก "init" ไม่ได้จัดสรรหน่วยความจำ แต่เป็นการตั้งค่าวัตถุเท่านั้น (ตัวสร้าง แฟชั่น). หากคุณได้รับออบเจ็กต์ที่จัดสรรและฟังก์ชันของคุณเรียกว่า init เท่านั้นคุณจะไม่ปล่อยมัน:
- (void)func:(NSObject*)allocd_but_not_init
{
[allocd_but_not_init init];
}
นั่นไม่ได้ใช้หน่วยความจำมากกว่าที่คุณเริ่มต้นไปแล้ว (สมมติว่า init ไม่ได้สร้างอินสแตนซ์ออบเจ็กต์ แต่คุณจะไม่รับผิดชอบต่อสิ่งเหล่านั้น)