10

Tôi đẩy một bộ điều khiển xem vào stack điều khiển chuyển hướng của tôi từ bên trong phương pháp didSelectRowAtIndexPath TableViewController của tôi như vậy:Tại sao điều này lại được phát hành? UINavigationController/UITableView

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
MyObject *myO = (MyObject *)[appDelegate.myOs objectAtIndex:indexPath.row]; 
myViewController.amount = myO.amount; 
[self.navigationController pushViewController:myViewController animated:YES]; 
[myViewController release]; 

Nếu tôi bỏ ghi chú rằng dòng cuối cùng thì treo ứng dụng khi trở về với một lỗi:

-[CALayer release]: message sent to deallocated instance 0xd4f860 

Đào sâu hơn một chút, tôi thấy tai nạn có thể bị thu hẹp lại thành lệnh gọi [super dealoc] trong phương thức dealoc của MyViewController. Bằng cách uncommenting "[super dealoc]", chúng tôi không sụp đổ.

Tôi đang gặp sự cố khi thu hẹp hơn nữa. "siêu" sẽ là lớp UIViewController và tôi không thể điều tra thêm rằng phương pháp dealoc ... tôi có thể? Có lẽ có một cách để xem chính xác những gì 0xd4f860 chỉ đến nhưng tôi không biết làm thế nào? Bất kỳ ý tưởng?

+0

Bạn có đang phát hành myViewController.view ở bất kỳ đâu không? –

Trả lời

4

Bạn đang tìm kiếm địa điểm sai - vấn đề là myViewController đang được phát hành (hoặc tự động phát hành) quá nhiều lần.

Mã bạn đã đăng có vẻ chính xác, vì vậy tôi sẽ xem mã của MyViewController để xem liệu nó có tự phát hành hay không, hoặc bằng cách nào đó tự nó được giải phóng bằng các phương tiện khác.

Bạn cũng có thể ghi đè phương thức phát hành, đặt điểm ngắt và xem liệu bạn có thể thu hẹp theo cách đó hay không ... ví dụ:

- (void)release { 
    [super release]; //Set breakpoint here 
} 
+0

Chỉ cần cố gắng ghi đè phương thức phát hành và đặt dấu ngắt ở đó ... nó được gọi là 21 lần trên đường vào (tôi giả sử được kích hoạt bởi didSelectRowAtIndexPath) và sau đó 8 lần khác khi sao lưu khỏi chế độ xem. Không chắc chắn những gì tôi nên tìm kiếm ... một toàn bộ rất nhiều khuôn khổ các cuộc gọi trong đó ("Purple"?!?, Vv ...) – Meltemi

+0

mythogen mang đến một điểm tốt - bạn nên tìm kiếm những nơi mà xem được phát hành (đó là những gì cuối cùng gây ra ngoại lệ, khi nó cố gắng để deallocate một lớp đã biến mất.) –

+0

Tìm thấy vấn đề, tôi nghĩ. Ít nhất nó không bị rơi nữa. Tôi đã có 2 trường hợp của một lớp con UIView đã được xem phụ của xem MyVC ... nhưng cũng cần thiết để giao tiếp trở lại lên MyVC để có một tài sản cho nó. Tôi thiết lập tài sản đó bằng cách chỉ định (thay vì giữ lại), trớ trêu thay, hướng dẫn của bạn trong một bình luận ở đây: . Nó làm cho tinh thần tại sao tôi không nên muốn giữ lại VC vì vậy tôi sẽ không kết thúc với một chu kỳ giữ lại ... nhưng w/ra nó tôi sụp đổ. Tôi, rõ ràng, vẫn còn hiểu lầm điều gì đó ở đây. Chào mừng những lời khuyên/phê bình nếu bạn có thời gian ... – Meltemi