2009-03-16 14 views
8

Tôi có một ứng dụng dựa trên tài liệu và tôi đã phân loại là NSDocument và cung cấp các phương thức cần thiết, nhưng tài liệu của tôi cần dọn dẹp rộng rãi (cần chạy các tác vụ bên ngoài, v.v.). Đâu là nơi tốt nhất để đặt cái này? Tôi đã thử một vài phương pháp khác nhau như:Nơi nào bạn đặt mã dọn dẹp cho các lớp con NSDocument?

  • close
  • close:
  • canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo
  • dealloc

Nếu tôi đặt nó trong dealloc, đôi khi nó được gọi và thời gian khác nó không (nhấn Command + Q dường như bỏ qua deallocation của tài liệu của tôi), nhưng nó là bắt buộc rằng mã này được gọi là không có fai thu hút (trừ khi chương trình kết thúc bất ngờ).

Trả lời

8

Làm cho mỗi tài liệu tự thêm mình làm người quan sát trong trung tâm thông báo địa phương cho NSApplicationWillTerminateNotification. Trong phương thức thông báo của nó, hãy gọi phương thức làm sạch của nó (bạn cũng nên gọi từ dealloc hoặc close).

8

Câu trả lời đúng ở đây không phù hợp với trường hợp sử dụng của tôi, nhưng câu hỏi có. Do đó câu trả lời bổ sung.

Trường hợp sử dụng của tôi: đóng tài liệu (có thể là một trong số nhiều tài liệu đang mở) nhưng không đóng ứng dụng.

Trong trường hợp này (tại thời điểm viết và trừ khi tôi chỉ tìm kiếm địa điểm sai), documentation không hữu ích như nó có thể.

Tôi đã thêm ghi đè canCloseDocumentWithDelegate:shouldCloseSelector:contextInfo: trong lớp con NSDocument của tôi và được gọi là siêu bên trong nó. Tài liệu không cho biết bạn có phải gọi siêu hay không, nhưng một chút ghi nhật ký cho thấy rằng hệ thống đang cung cấp bộ chọn và ngữ cảnh. Phương thức này được gọi ngay trước khi tài liệu được đóng lại.

- (void) canCloseDocumentWithDelegate:(id)delegate shouldCloseSelector:(SEL)shouldCloseSelector contextInfo:(void *)contextInfo; 
{ 
    if ([self pdfController]) 
    { 
     [[[self pdfController] window] close]; 
     [self setPdfController: nil]; 
    } 

    [super canCloseDocumentWithDelegate:delegate shouldCloseSelector: shouldCloseSelector contextInfo: contextInfo];  
} 

Có một số thảo luận hữu ích về phương pháp này trên CocoaBuilder. Nếu có những nhược điểm đối với cách tiếp cận này hoặc cách tốt hơn để làm điều này, xin vui lòng bình luận.

+2

Tôi không nghĩ rằng điều này là hoàn toàn chính xác: bạn chỉ nên thực hiện dọn dẹp trong shouldCloseSelector vì shouldCloseSelector chỉ được gọi nếu tài liệu sẵn sàng đóng (ví dụ: lưu thành công). Phương thức canClose này được gọi là không cho biết rằng tài liệu sẽ thực sự bị đóng (ví dụ: lưu có thể thất bại). – Joel