2011-10-20 35 views
6

Tôi đang sử dụng Xcode 4.2 để viết và Clang 3.0 để tạo chương trình thể hiện một sự cố cụ thể.Quá phát hành khiến cửa sổ bị tê liệt

Chương trình có cửa sổ có nghĩa là giữ xung quanh được đặt trong nib thành “Thả khi đóng”, vì vậy nó được phát hành quá mức trong các lần sử dụng tiếp theo. Nó có nghĩa là một tấm, vì vậy nó được hiển thị bằng cách sử dụng beginSheet:modalForWindow:modalDelegate:didEndSelector:contextInfo:. Cố gắng hiển thị cửa sổ lần thứ hai hoặc thứ ba sẽ làm hỏng ứng dụng.

Tôi nhớ rằng đã xảy ra một năm trước, với chương trình nhận được EXC_BAD_ACCESS và điều đó kích hoạt trình gỡ lỗi dừng tại điểm đó. Tôi cũng nhớ có thể tìm kiếm vấn đề trong các dụng cụ bằng cách sử dụng mẫu Zombies.

Đó là những gì tôi muốn (chương trình này là một phần của bản trình bày để hiển thị các kỹ thuật gỡ lỗi), nhưng đó không phải là những gì đang diễn ra. Bây giờ, chương trình không sụp đổ; Các công cụ cho thấy số lượng lưu giữ trên cửa sổ giảm xuống 1 lần, nhưng không thấp hơn, vì vậy nó không được giải phóng.

Điều đó sẽ ổn nếu sự cố dừng lại ở đó; Tôi có thể chỉ đơn giản là ẩn và hiển thị tờ một hoặc hai lần nữa. Vấn đề là, lần thứ hai tôi mang tờ (nên-chết-nhưng-vẫn-có-ít-một-giữ-giữ-nó-sống), nó tê liệt.

Do đó tôi có nghĩa là không có trang tính hay bất kỳ điều khiển nào trong đó (nó chứa trường, dạng xem văn bản và hai nút) phản hồi sự kiện. Nhịp tim không làm gì trong đó; cửa sổ có nút OK, nhưng khi cửa sổ bị tê, nút OK không bị rung. Không có gì hoạt động để loại bỏ trang tính.

Nhưng chương trình không bị lỗi. Tôi vẫn có thể tương tác với các menu và Dock cho thấy chương trình đang phản hồi. Nếu tôi cố gắng bỏ nó, nó sẽ phát ra tiếng bíp, vì nó có một tờ giấy.

Điều gì khiến cửa sổ bị tê liệt và tôi có thể làm gì với nó?

Dưới đây là một phiên bản thu gọn của chương trình cũng bộc lộ vấn đề: https://github.com/boredzo/NumbWindow

+0

Phụ lục: Chơi với ứng dụng thử nghiệm hơn nữa, có vẻ như tờ đã xuất hiện ở bất kỳ trạng thái nào. Nếu tôi đóng nó bằng cách nhấp vào nút Hủy, thì nút Hủy vẫn được tô sáng khi quay lại. –

+0

ARC có được bật không? – NJones

+0

@NJones: Không. Tôi có thể sẽ gắn bó với MRC trong chương trình này và trình bày miễn là có một cơ hội tốt Cocoa lập trình mới sẽ cần phải sử dụng mã MRC, ngay cả khi họ không viết nó được nêu ra. –

Trả lời

4

Tôi không nghĩ rằng bạn nên sử dụng -close để làm cho tờ đi. Nếu bạn thay đổi dòng [sheet close]; thành [sheet orderOut:self];, thì nó hoạt động bình thường.

Đối với lý do tại sao chúng khác nhau, tôi không biết. Nhưng kinh nghiệm của tôi là luôn sử dụng -orderOut: để loại bỏ trang tính và không bao giờ -close. The documentation backs me up on this:

Liệt kê 3 Did-end selector

- (void)didEndSheet:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo 
{ 
    [sheet orderOut:self]; 
} 

tl; dr:

Bạn đang sử dụng phương pháp sai để làm cho bảng điều khiển đi.

+0

Thú vị. Nhược điểm là tôi sẽ cần phải suy nghĩ về một số cách khác để thực hiện các lỗi với RWC, nhưng đó là một vấn đề cho một ngày khác. Cảm ơn. –

+0

FTD: "Gọi phương thức' orderOut: 'làm cho cửa sổ bị xóa khỏi màn hình, nhưng không làm cho cửa sổ được giải phóng. Xem phương thức' close' để biết thông tin khi một cửa sổ được giải phóng. " (Tôi cũng gần như không bao giờ sử dụng '-close'); – Wevah

+1

Tài liệu này khuyên bạn nên 'orderOut:', nhưng không đặc biệt chống lại 'close' hoặc đưa ra bất kỳ lý do gì mà tôi có thể thấy tại sao không. –

Các vấn đề liên quan