ฉันต้องการทราบว่าคุณใช้สถานการณ์ใด-retainCount
จนถึงขณะนี้และในที่สุดปัญหาที่อาจเกิดขึ้นเมื่อใช้งาน
ขอบคุณ.
ฉันต้องการทราบว่าคุณใช้สถานการณ์ใด-retainCount
จนถึงขณะนี้และในที่สุดปัญหาที่อาจเกิดขึ้นเมื่อใช้งาน
ขอบคุณ.
คำตอบ:
คุณไม่ควรใช้-retainCount
เพราะมันไม่เคยบอกอะไรที่เป็นประโยชน์ การดำเนินการตามกรอบ Foundation และ AppKit / UIKit นั้นทึบแสง คุณไม่รู้ว่ามีอะไรถูกเก็บไว้ทำไมจึงถูกเก็บรักษาใครเป็นผู้เก็บรักษาเมื่อถูกเก็บรักษาและอื่น ๆ
ตัวอย่างเช่น:
[NSNumber numberWithInt:1]
จะมีretainCount
1 มันไม่มี มันคือ 2@"Foo"
จะมีretainCount
1 มันไม่มี เป็น 1152921504606846975[NSString stringWithString:@"Foo"]
จะมีretainCount
1 มันไม่มี อีกครั้งคือ 1152921504606846975โดยพื้นฐานแล้วเนื่องจากสิ่งใด ๆ สามารถรักษาวัตถุไว้ได้ (ดังนั้นจึงเปลี่ยนแปลงได้retainCount
) และเนื่องจากคุณไม่มีแหล่งที่มาของโค้ดส่วนใหญ่ที่เรียกใช้แอปพลิเคชันวัตถุretainCount
จึงไม่มีความหมาย
หากคุณกำลังพยายามค้นหาสาเหตุที่วัตถุไม่ได้รับการจัดสรรให้ใช้เครื่องมือ Leaks ในเครื่องมือ หากคุณกำลังพยายามติดตามว่าเหตุใดวัตถุจึงถูกยกเลิกการจัดสรรเร็วเกินไปให้ใช้เครื่องมือ Zombies ในเครื่องมือ
แต่อย่าใช้-retainCount
. เป็นวิธีการที่ไร้ค่าอย่างแท้จริง
แก้ไข
ขอให้ทุกคนไปที่http://bugreport.apple.comและขอ-retainCount
ให้เลิกใช้งาน ยิ่งมีคนขอมากเท่าไรก็ยิ่งดี
แก้ไข # 2
ในการอัปเดต[NSNumber numberWithInt:1]
ตอนนี้มีretainCount
9223372036854775807 หากรหัสของคุณคาดว่าจะเป็น 2 แสดงว่ารหัสของคุณเสียแล้ว
- (NSUInteger)retainCount{return NSUIntegerMax;}
)
retainCount
ที่คุณสามารถทำเดี่ยวโดยไม่ต้องเอาชนะ
อย่างจริงจัง. เพียงแค่ไม่ทำมัน
เพียงทำตามแนวทางการจัดการหน่วยความจำและมีเพียงปล่อยสิ่งที่คุณalloc
, new
หรือcopy
(หรือสิ่งที่คุณเรียกว่าretain
เมื่อเดิม)
@bbum กล่าวว่าที่ดีที่สุดที่นี่ใน SOและในรายละเอียดมากขึ้นในบล็อกของเขา
-retainCount
สามารถรับได้ (พร้อมรายละเอียดเพิ่มเติม) จากเครื่องมือและเครื่องมือต่างๆ
retain
, retain
, retain
, autorelease,
autorelease, autorelease
อาจเป็นผลที่ถูกต้องสมบูรณ์ของการส่งผ่านวัตถุผ่าน UIKit API เช่น
Autoreleased object เป็นกรณีหนึ่งที่การตรวจสอบ -retainCount ไม่เป็นข้อมูลและอาจทำให้เข้าใจผิดได้ จำนวนการเก็บรักษาจะไม่บอกคุณว่ามีการเรียกใช้อ็อบเจ็กต์กี่ครั้งแล้วดังนั้นจำนวนครั้งที่ปล่อยออกมาเมื่อพูลการปล่อยอัตโนมัติในปัจจุบันหมดลง
ฉันไม่พบ retainCounts ประโยชน์มากเมื่อตรวจสอบโดยใช้ 'เครื่องมือ'
ใช้เครื่องมือ 'การจัดสรร' ตรวจสอบให้แน่ใจว่า 'บันทึกจำนวนอ้างอิง' เปิดอยู่และคุณสามารถเข้าไปในออบเจ็กต์ใดก็ได้และดูประวัติการเก็บรักษา
ด้วยการจับคู่การจัดสรรและการเผยแพร่คุณจะได้ภาพที่ดีเกี่ยวกับสิ่งที่เกิดขึ้นและมักจะแก้ไขกรณีที่ยากลำบากเหล่านั้นซึ่งมีบางอย่างไม่ได้รับการปลดปล่อย
สิ่งนี้ไม่เคยทำให้ฉันผิดหวัง - รวมถึงการค้นหาข้อบกพร่องใน iOS รุ่นเบต้ารุ่นแรก ๆ
ดูเอกสารของ Apple เกี่ยวกับ NSObject มันค่อนข้างครอบคลุมคำถามของคุณ: NSObject RetainCount
ในระยะสั้น RetainCount อาจไม่มีประโยชน์สำหรับคุณเว้นแต่คุณจะติดตั้งระบบการนับอ้างอิงของคุณเอง (และฉันเกือบจะรับประกันได้ว่าคุณจะไม่มี)
ในคำพูดของ Apple RetainCount คือ "โดยทั่วไปแล้วจะไม่มีค่าในการแก้ปัญหาการจัดการหน่วยความจำ"
แน่นอนว่าคุณไม่ควรใช้วิธีการ RetainCount ในโค้ดของคุณเนื่องจากความหมายของค่าของมันขึ้นอยู่กับจำนวน autoreleases ที่ถูกนำไปใช้กับวัตถุและนั่นคือสิ่งที่คุณไม่สามารถคาดเดาได้ อย่างไรก็ตามมันมีประโยชน์มากสำหรับการดีบัก - โดยเฉพาะอย่างยิ่งเมื่อคุณค้นหาการรั่วไหลของหน่วยความจำในโค้ดที่เรียกใช้เมธอดของวัตถุ Appkit นอกลูปเหตุการณ์หลักและไม่ควรเลิกใช้งาน
ในความพยายามของคุณที่จะทำให้ประเด็นของคุณคุณได้กล่าวเกินจริงถึงลักษณะของคุณค่าที่ไม่อาจหยั่งรู้ได้ เป็นความจริงที่ไม่ใช่การนับอ้างอิงเสมอไป มีค่าพิเศษบางอย่างที่ใช้สำหรับแฟล็กตัวอย่างเช่นเพื่อระบุว่าไม่ควรยกเลิกการจัดสรรอ็อบเจ็กต์ ตัวเลขเช่น 1152921504606846975 ดูลึกลับมากจนกว่าคุณจะเขียนเป็นเลขฐานสิบหกและได้ 0xffffffffffffffff และ 9223372036854775807 เป็น 0x7fffffffffffffff ในเลขฐานสิบหก และไม่น่าแปลกใจเลยที่ใครบางคนจะเลือกใช้ค่าเช่นนี้เป็นแฟล็กเนื่องจากต้องใช้เวลาเกือบ 3000 ปีในการได้รับ RetainCount ให้สูงเท่ากับจำนวนที่มากขึ้นโดยสมมติว่าคุณเพิ่มค่า RetainCount 100,000,000 ครั้งต่อวินาที
คุณจะได้รับปัญหาอะไรบ้างจากการใช้งาน? สิ่งที่ได้ก็คือส่งคืนจำนวนการเก็บรักษาของวัตถุ ฉันไม่เคยโทรหามันและคิดไม่ออกว่าจะมีเหตุผลอะไร ฉันได้แทนที่มันใน singletons เพื่อให้แน่ใจว่าพวกเขาไม่ได้ถูกจัดสรร
retainCount
สำหรับการจัดการหน่วยความจำ
คุณไม่ควรกังวลเกี่ยวกับการรั่วไหลของหน่วยความจำจนกว่าแอปของคุณจะเริ่มทำงานและทำสิ่งที่เป็นประโยชน์
เมื่อเป็นเช่นนั้นให้เปิดเครื่องมือและใช้แอพและดูว่าหน่วยความจำรั่วเกิดขึ้นจริงหรือไม่ ในกรณีส่วนใหญ่คุณสร้างออบเจ็กต์ด้วยตัวเอง (คุณจึงเป็นเจ้าของ) และลืมปล่อยมันหลังจากที่ทำเสร็จแล้ว
อย่าพยายามเพิ่มประสิทธิภาพโค้ดของคุณในขณะที่คุณกำลังเขียนมันการคาดเดาของคุณเกี่ยวกับสิ่งที่อาจทำให้หน่วยความจำรั่วหรือใช้เวลานานเกินไปมักจะผิดเมื่อคุณใช้งานแอปตามปกติ
พยายามเขียนโค้ดที่ถูกต้องเช่นถ้าคุณสร้างออบเจ็กต์โดยใช้การจัดสรรและสิ่งนั้นให้แน่ใจว่าคุณปล่อยมันอย่างถูกต้อง
คุณไม่ควรใช้ในโค้ดของคุณ แต่สามารถช่วยได้อย่างแน่นอนเมื่อทำการดีบั๊ก
อย่าใช้ -retainCount ในรหัสของคุณ อย่างไรก็ตามหากคุณใช้คุณจะไม่เห็นว่ามันส่งกลับศูนย์ ลองคิดดูว่าทำไม :-)
ตัวอย่างที่ใช้ในโพสต์ของ Dave คือ NSNumber และ NSStrings ... ดังนั้นหากคุณใช้คลาสอื่น ๆ เช่น UIViews ฉันมั่นใจว่าคุณจะได้รับคำตอบที่ถูกต้อง (จำนวนที่คงไว้ขึ้นอยู่กับการนำไปใช้และสามารถคาดเดาได้)
-retainCount
.