UIPopovercontroller dealloc ถึงในขณะที่ยังมองเห็นป๊อปโอเวอร์


111

ฉันขอรับรองว่าฉันได้มองหาคำตอบใน SO สำหรับคำถามของฉัน แต่ไม่มีคำตอบใดที่เป็นประโยชน์ ที่นี่ฉันมีรหัสง่ายๆที่ควรนำเสนอUIImagePickerControllerภายใน a UIPopoverController:

-(void)takePicture:(id)sender{
UIImagePickerController *picker=[[UIImagePickerController alloc] init];
picker.delegate=self;
picker.sourceType=UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing=YES;
UIPopoverController *poc=[[UIPopoverController alloc] 
                            initWithContentViewController:picker];
[poc presentPopoverFromBarButtonItem:bbItem 
            permittedArrowDirections:UIPopoverArrowDirectionAny
                            animated:NO];
}

ตั้งแต่ครั้งแรกที่ฉัน[UIPopoveController dealloc]ไปถึงในขณะที่ ... เกิดข้อผิดพลาดและโปรแกรมขัดข้อง ฉันไม่ได้ทำการเก็บรักษาปล่อยหรือปล่อยอัตโนมัติตาม ARC มีการพิจารณาเป็นพิเศษUIPopoverControllersเมื่อได้รับประโยชน์จาก ARC หรือไม่?

คำตอบ:


203

UIPopoverControllers ควรอยู่ในตัวแปรอินสแตนซ์เสมอ เป็นแนวทางปฏิบัติที่ดีในการสร้างคุณสมบัติที่แข็งแกร่งให้กับมัน

UPDATE:

ในฐานะของ iOS 8 UIPopoverPresentationControllerคุณควรจะใช้ จากนั้นคุณไม่จำเป็นต้องอ้างอิงถึงป๊อปโอเวอร์เนื่องจากมีการจัดการโดยตัวควบคุมการนำเสนอ

ตัวอย่างโค้ด (ใช้ได้ทั้งบน iPhone และ iPad):

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.allowsEditing = YES;
picker.modalPresentationStyle = UIModalPresentationPopover;
UIPopoverPresentationController* popoverPC = picker.popoverPresentationController;
popoverPC.barButtonItem = bbItem;
popoverPC.permittedArrowDirections = UIPopoverArrowDirectionAny;
[self presentViewController:picker animated:YES completion:nil];

1
อ้อเข้าใจแล้ว. แต่นี่ไม่เหมือนกับ UIAlertView ใช่ไหม ฉันไม่เคยมีไอวาร์สำหรับมันฉันแค่จัดสรรเริ่มต้นทุกที่ที่ฉันต้องการแสดงมันแล้ว [เคย] ปล่อย popovercontroller แตกต่างกันอย่างไร?
Mikayil Abdullayev

17
@Mikayil alertView จะถูกเก็บไว้โดย superview (ตามมุมมองทั้งหมด) แต่ popoverController ไม่ใช่มุมมองดังนั้นจึงไม่มี superview ดังนั้นจะไม่มีใครเก็บไว้ถ้าคุณไม่เก็บมันไว้ (หรือ เก็บไว้ในตัวแปรที่แข็งแกร่งซึ่งมีขอบเขตที่ยาวกว่าวิธีการปัจจุบัน - เช่น iVar)
fzwo

1
แต่ฉันยังคงสับสนเกี่ยวกับจำนวนการคงไว้ของ UIPopoverController เพราะฉันทำการตรวจสอบก่อนที่จะจัดสรรและเริ่มต้น และเฉพาะในกรณีที่ไม่มีฉันจะจัดสรรใหม่ แต่หลังจากจัดสรรครั้งแรกฉันไม่เคยได้รับมันเลย ฉันหมายถึงฉันเรียกวิธีการหนึ่งครั้ง ที่นั่นฉันจัดสรรและเริ่มต้นไอวาร์ของฉัน และในครั้งต่อไปเมื่อฉันเรียกวิธีนั้นอีกครั้งคราวนี้ฉันพบว่า ivar ของฉันจัดสรรไว้แล้ว ถ้า ARC ดูแลเรื่องนี้แล้วจะปล่อยเมื่อไหร่ หรือมันปล่อยอัตโนมัติ?
Mikayil Abdullayev

@Mikayil ivars ได้รับการเผยแพร่โดย ARC เมื่อวัตถุถูกยกเลิกการจัดสรรหรือเมื่อคุณตั้งค่าเป็นศูนย์
เฟลิกซ์

แต่พวกเขาไม่ได้พูดถึงสิ่งนี้ในเอกสารในส่วนวิธีการใช้พวกเขาใช้ตัวแปรท้องถิ่น
Amit Battan

11

เมื่อฟังก์ชันออกจะไม่มีการอ้างอิงอื่น ๆ ไปยังตัวควบคุมป็อปโอเวอร์ดังนั้นจึงยกเลิกการจัดสรรเร็วเกินไป

ลองเพิ่มเป็นสมาชิกของชั้นเรียนแทน

ทิม


ฉันควรจะมองเห็นมันก่อนที่จะเลิกจัดสรรหรือไม่
Mikayil Abdullayev

10

การเพิ่มสิ่งที่ @ phix23 ตอบสร้างคุณสมบัติ * poc ดังนี้:

@property (nonatomic, retain) IBOutlet UIPopoverController *poc;

แล้วเปลี่ยน

UIPopoverController *poc = [[UIPopoverController alloc] 
                            initWithContentViewController:picker];

สำหรับ

self.poc = [[UIPopoverController alloc] 
                            initWithContentViewController:picker];

11
คุณไม่จำเป็นต้องใส่ไว้ในไฟล์. h ของคุณ นั่นจะทำให้เป็นสาธารณะและถ้าคุณไม่ต้องการสิ่งนั้นเพียงแค่ทำให้เป็นคุณสมบัติในไฟล์. m ของคุณ
Joshua Dance
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.