2011-01-22 29 views
8

Cấu trúc ứng dụng của tôi như sau, phần cốt lõi được viết bằng C++ và sử dụng chuỗi chủ yếu, và tôi đang phát triển giao diện người dùng trong mục tiêu C trên đầu trang của nó, nếu tôi không thực thi chuỗi hoạt động tốt, nhưng tôi không thể vô hiệu hóa, ngăn chặn chủ đề, giao diện người dùng được đâm một cách ngẫu nhiên trong nhật ký tôi có thể thấy, sau thông điệp"Tự động thuê không có hồ bơi tại chỗ" có nghĩa là gì?

__NSAutoreleaseNoPool(): Object 0x350270 of class NSCFString autoreleased with no pool in place - just leaking 

thư giống nhau đến hơn sau đó một lần, bởi googling đến để nhận biết, tôi cần phải thiết lập NSAutoreleasePool để thoát khỏi của nó, nhưng làm thế nào nó có thể tích hợp cùng với mã C++.

Edit: Lõi lib sẽ được kích hoạt từ giao diện người dùng, vì thế tôi cho rằng, nó an toàn để nói UI đang chạy trong thread chính, Lib đang tạo ra/chấm dứt chủ đề mà không thông báo UI, trong trường hợp này, tôi có thể gọi AutoReleasePool trong giao diện người dùng

Có ai có thể hướng dẫn tôi không?

Trả lời

7

Xem các tài liệu cho những gì bạn nên biết về đa luồng với Cocoa: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html

Đó là OK để thiết kế ứng dụng của bạn như bạn có, nhưng hai điều cần được lưu ý:

  1. Cuộc sống là đơn giản nhất (và đôi khi cần thiết) khi điều khiển giao diện người dùng như chế độ xem (AppKit hoặc UIKit) được thao tác trên chuỗi chính. Bạn có thể sử dụng các đối tượng Foundation và một số đối tượng AppKit/UIKit trên các chủ đề nền và một số đối tượng Foundation có thể được sử dụng từ nhiều luồng.
  2. Nếu bạn đang sử dụng bất kỳ đối tượng Ca cao nào trong tất cả các chủ đề nền, bạn sẽ cần thiết lập các nhóm tự động trả lời trên các chủ đề đó.

Giống như vậy:

- (void)backgroundThreadStart 
{ 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 

    // do stuff 

    [pool release]; 
} 

Điều đó sẽ sửa chữa giao diện điều khiển lỗi của bạn, nhưng bạn có thể có những vấn đề khác mà dẫn đến việc thực tế đâm bạn đang nhìn thấy.

+0

Xin chào, hãy để tôi cố gắng thêm điều gì đó khác trong câu hỏi của tôi – Amitg2k12

1

Điều đó có nghĩa là bạn tự động phát hành thứ gì đó mà không cần có bể tự động.

Mọi luồng đều có một nhóm các bể tự động. Trên chủ đề chính, một nhóm autorelease được tạo cho bạn trước khi Cocoa gọi ra mã của bạn và rút ra sau khi mã của bạn trả về. Mỗi đối tượng bạn tự động phát hiện (cho dù một cách rõ ràng hoặc ngầm) đi vào hồ bơi, do đó hồ bơi sẽ giải phóng nó khi hồ bơi bị cạn kiệt. Khi bạn tạo một chuỗi, bạn phải tự tạo và thoát một nhóm tự động trả lời trên chính chuỗi đó. (Hoặc không tự động phát hiện bất cứ điều gì, nhưng điều đó thực tế là không thể đối với bất kỳ số lượng mã nào có ý nghĩa.)

Nếu bạn quyết định chạy mã dưới thu gom rác, bạn cần gửi hồ bơi drain, chứ không phải release, bạn đã làm xong với nó, vì hồ bơi có ích. Khi tính năng GC được bật, các thông báo releaseautorelease sẽ không hoạt động — thậm chí chúng không đi qua. Hồ bơi autorelease của bạn sẽ đáp ứng với drain bằng cách chọc bộ thu gom rác, là thiết bị tương đương gần nhất để giải phóng các vật thể có trong hồ bơi.

The Memory Management Programming Guide for Cocoa có thêm thông tin về các bể tự động, trong số những thứ khác.

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