2011-01-22 16 views
8

Moja struktura aplikacji jest następująca, główna część jest napisana w C++ i mocno używa wątku, a ja rozwijam interfejs użytkownika w Objective C na nim, jeśli nie wykonuję wątku, to działa dobrze, ale ja nie można wyłączyć, stop wątku, UI jest upaść losowo w dzienniku widziałam, po wiadomościCo oznacza komunikat "Autoreleased with no pool in place"?

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

Podobne komunikaty pochodzące więcej niż raz, przez googlowania poznali, muszę ustawić NSAutoReleasePool pozbyć z niego, ale jak można go zintegrować z kodem C++.

Edit: Rdzeń lib zostanie aktywowany z UI, stąd przypuszczam, jej na pewno powiedzieć, UI jest uruchomiony w głównym wątku, Lib jest tworzenie/zakończenia wątku bez powiadamiania UI, w tym przypadku, mogę zadzwonić AutoReleasePool w interfejsie użytkownika

Czy każdy może mnie prowadzić?

Odpowiedz

7

Zobacz te dokumenty za to, co trzeba wiedzieć o wielowątkowość z kakao: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html

Jest OK, aby zaprojektować aplikację, jak trzeba, ale dwie rzeczy, które należy mieć na uwadze:

  1. Życie jest najprostszym (i czasami konieczne), gdy elementy interfejsu użytkownika, takie jak widoki (AppKit lub UIKit) są manipulowane na głównym wątku. Możesz używać obiektów Foundation i niektórych obiektów AppKit/UIKit na wątkach tła, a niektóre obiekty Foundation mogą być używane z wielu wątków.
  2. Jeśli używasz jakichkolwiek obiektów Cocoa w ogóle w wątkach w tle, musisz skonfigurować pule autorelease na tych wątkach.

tak:

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

    // do stuff 

    [pool release]; 
} 

To będzie naprawić swoje błędy konsoli, ale może masz inne problemy, które doprowadziły do ​​faktycznej awarii pan widzi.

+0

Witam, pozwól, że spróbuję dodać coś więcej w moim pytaniu – Amitg2k12

1

Oznacza to, że autoreleased coś bez puli autorelease w miejscu.

Każdy wątek ma stos puli autoreas. W głównym wątku tworzona jest pula autoreleaseów, zanim Cocoa wywoła Twój kod i spuszczony po powrocie twojego kodu. Każdy obiekt autooddzielany (jawnie lub niejawnie) trafia do puli, aby pula uwolniła go po wyczerpaniu puli. Kiedy tworzysz wątek, musisz samodzielnie utworzyć i opróżnić pulę autoreleaseów w tym wątku. (Lub po prostu nieautoryzować niczego, ale jest to praktycznie niemożliwe dla jakiejkolwiek znaczącej ilości kodu).

Jeśli kiedykolwiek zdecydujesz się uruchomić swój kod w ramach zbierania śmieci, musisz wysłać pulę drain, a nie release, gdy skończycie z tym, aby pula była przydatna. Gdy GC jest włączone, wiadomości nie robią nic, nawet nie przechodzą. Twoja pula autorelease odpowie na drain, naciskając na garbage collector, który jest najbliższym odpowiednikiem zwolnienia obiektów, które mogłyby znajdować się w puli.

The Memory Management Programming Guide for Cocoa ma więcej informacji o pulach autorelease, między innymi.