ฉันเป็นเจ้าของออบเจ็กต์ที่ส่งคืนโดย AudioSessionGetProperty หรือไม่

เมธอดนี้มีชื่อเป็น "Get" และจะไม่ส่งคืนบางสิ่งผ่าน return ใช้ตัวชี้เช่น CFStringRef เช่นนี้

CFStringRef outValue;
UInt32 propertySize = sizeof(outValue);
AudioSessionGetProperty(propertyID, &propertySize, &outValue);

เอกสารระบุว่าฟังก์ชัน "คัดลอก" ค่าลงในตัวชี้ outValue ที่ให้มา

นี่คือการสร้างออบเจ็กต์ที่มีการนับ +1 และฉันมีหน้าที่รับผิดชอบในการปล่อย / ปล่อยข้อมูลนั้นหรือไม่




คำตอบ (1)


ตามเอกสารประกอบสำหรับ AudioSessionGetProperty ขึ้นอยู่กับว่าคุณสมบัติที่คุณได้รับนั้นเป็นประเภท C หรือเป็นค่าพื้นฐานหลักหรือไม่:

ค่าคุณสมบัติ Core Audio บางค่าเป็นประเภท C และค่าอื่น ๆ เป็นออบเจ็กต์ Core Foundation:

หากคุณเรียกใช้ฟังก์ชันนี้เพื่อดึงค่าที่เป็นวัตถุ Core Foundation ฟังก์ชันนี้จะทำซ้ำวัตถุแม้จะใช้คำว่า "Get" ในชื่อก็ตาม คุณมีหน้าที่รับผิดชอบในการปล่อยอ็อบเจ็กต์ ตามที่อธิบายไว้ใน “กฎการสร้าง” ในคู่มือการเขียนโปรแกรมการจัดการหน่วยความจำสำหรับ Core Foundation

ดังนั้นหากสิ่งที่คุณได้รับคือมูลค่าทรัพย์สินของรากฐานหลัก คุณจะต้องแน่ใจว่าได้ปล่อยออบเจ็กต์ผลลัพธ์ออกมาแล้ว

โปรดทราบว่าการใช้ ARC จะไม่ดูแลเรื่องนี้ให้คุณโดยอัตโนมัติ จากคู่มือการเขียนโปรแกรม ARC:

ในแอปพลิเคชัน Cocoa จำนวนมาก คุณต้องใช้ออบเจ็กต์สไตล์ Core Foundation ไม่ว่าจะมาจากเฟรมเวิร์ก Core Foundation เอง (เช่น CFArrayRef หรือ CFMutableDictionaryRef) หรือจากเฟรมเวิร์กที่ใช้หลักการของ Core Foundation เช่น Core Graphics (คุณอาจใช้ประเภทเช่น CGColorSpaceRef และ CGGradientRef ).

คอมไพเลอร์ไม่ได้จัดการอายุการใช้งานของวัตถุ Core Foundation โดยอัตโนมัติ คุณต้องเรียก CFRetain และ CFRelease (หรือตัวแปรเฉพาะประเภทที่เกี่ยวข้อง) ตามกฎการจัดการหน่วยความจำ Core Foundation (ดูคู่มือการเขียนโปรแกรมการจัดการหน่วยความจำสำหรับ Core Foundation)

หากคุณแคสต์ระหว่างอ็อบเจ็กต์สไตล์ Objective-C และ Core Foundation คุณจะต้องบอกคอมไพลเลอร์เกี่ยวกับความหมายความเป็นเจ้าของของอ็อบเจ็กต์โดยใช้การส่ง (กำหนดใน objc/runtime.h) หรือมาโครสไตล์ Core Foundation (กำหนดใน NSObject.h):

person Tim Dean    schedule 12.01.2012