データを表す新しいウィジェットを作成する関数がプログラムにありますが、ウィジェットが作成されるたびに「NSAutoReleasePoolを使用しない自動リリース」というエラーメッセージが多く表示されます。 NSAutoReleasePoolはメインスレッドで自動的に作成されるはずですので、非同期関数がスレッドを作成する可能性があるため、これらのエラーメッセージが表示されます。NSAutoReleasePoolと非同期関数
最新情報を表すウィジェットを作成するために呼び出される関数です。この関数は、かなり頻繁に呼び出されます。
private void CreateAndDisplayTvShowWidget (TvShow show)
{
var Widget = new TvShowWidgetController (show);
Widget.OnRemoveWidget += ConfirmRemoveTvShow;
Widget.View.SetFrameOrigin (new PointF (0, -150));
Widget.View.SetFrameSize (new SizeF (ContentView.Frame.Width, 150));
ContentView.AddSubview (Widget.View);
show.ShowWidget = Widget;
}
この非同期関数が返すとき、この関数は通常、呼び出されます。
private static void WebRequestCallback (IAsyncResult result)
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
HttpWebResponse response = (HttpWebResponse)request.EndGetResponse (result);
StreamReader responseStream = new StreamReader (response.GetResponseStream());
string responseString = responseStream.ReadToEnd();
responseStream.Close();
ProcessResponse (responseString, request);
}
ProcessResponse(responseString、要求は)次のようになります。
private static void ProcessResponse (string responseString, HttpWebRequest request)
{
string requestUrl = request.Address.ToString();
if (requestUrl.Contains (ShowSearchTag)) {
List<TvShow> searchResults = TvDbParser.ParseTvShowSearchResults (responseString);
TvShowSearchTimeoutClock.Enabled = false;
OnTvShowSearchComplete (searchResults);
} else if (requestUrl.Contains (MirrorListTag)) {
MirrorList = TvDbParser.ParseMirrorList (responseString);
SendRequestsOnHold();
} else if (requestUrl.Contains (TvShowBaseTag)) {
TvShowBase showBase = TvDbParser.ParseTvShowBase (responseString);
OnTvShowBaseRecieved (showBase);
} else if (requestUrl.Contains (ImagePathReqTag)) {
string showID = GetShowIDFromImagePathRequest (requestUrl);
TvShowImagePath imagePath = TvDbParser.ParseTvShowImagePath (showID, responseString);
OnTvShowImagePathRecieved (imagePath);
}
}
CreateAndDisplayTvShowWidget (TvShow show)は、イベントOnTvShowBaseRecieved(TvShow)が呼び出されたときに呼び出されます。これはNSAutoReleasePoolに関するエラーメッセージを表示します。
最後の2つの関数は、クロスプラットフォームアセンブリすることになっているものの一部であるので、私はそこに任意のMonoMac固有のコードを持つことができません...
私は、任意の自動リリースを呼び出すことはありませんか私のウィジェットのリリースコードなので、MonoMacバインディングは自動的にガベージコレクションの一部としてこれを行うと仮定します。
何が間違っているかを理解するのに役立つかもしれないこの質問に、他に何を追加できますか?私はまだ答えに近づくことができません... –