0

ログに次のエラー メッセージがあります。

2011-10-13 10:41:44.504 Provision[386:6003] *** __NSAutoreleaseNoPool(): Object 0x4e0ef40 of class CABasicAnimation autoreleased with no pool in place - just leaking
2011-10-13 10:41:44.505 Provision[386:6003] *** __NSAutoreleaseNoPool(): Object 0x4b03700 of class NSConcreteValue autoreleased with no pool in place - just leaking
2011-10-13 10:41:44.506 Provision[386:6003] *** __NSAutoreleaseNoPool(): Object 0x4b04840 of class __NSCFDictionary autoreleased with no pool in place - just leaking

次のコードを実行すると、エラー メッセージが表示されます。

CGRect newFrame = [viewTop frame];
newFrame.origin.x = 0;
newFrame.origin.y = 0;
[UIView beginAnimations:@"nil1" context:nil];
[UIView setAnimationDuration:0.3f];
[viewTop setFrame:newFrame];
[UIView commitAnimations];

洞察はありますか?ご親切にありがとうございました

4

1 に答える 1

1

これは、自動解放プールが存在しないときに自動解放されたオブジェクトを使用しているために発生しています。NSAutoreleasePoolの詳細については、こちらをご覧ください。

ココアの開発で、次のような表現を見たことがあるかもしれません。

@"string text"
[NSMutableArray arrayWithCapacity: 42]
[someObject autorelease]

これらはすべて自動解放プールを利用します。最初の 2 つのケースでは、autoreleaseメッセージがオブジェクトに送信されます。最後のケースでは、オブジェクトに明示的に送信します。autoreleaseメッセージには、「最も近い自動解放プールが空になったときに参照カウントを減らす」と書かれています。次に例を示します。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSObject *myObject = [[NSObject alloc] init]; // some object
[myObject autorelease]; // send autorelease message
[pool release]; // myArray is released here!

ご想像のとおりautorelease、オブジェクトが後でプールを解放することを期待している場合、メモリ リークが発生する可能性があります。Cocoa はこれを検出し、上で投稿したエラーをスローします。

通常、Cocoa プログラミングでは、NSAutoreleasePoolは常に使用可能です。のNSApplication実行ループは、反復ごとにそれを排出します。ただし、メイン スレッドの外で作業を行っている場合 (つまり、独自のスレッドを作成した場合)、または または を呼び出す前に作業を行っている場合NSApplicationMain[NSApp run]自動解放プールは適切に配置されません。通常、これを追加することでこれを修正できます。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
CGRect newFrame = [viewTop frame];
newFrame.origin.x = 0;
newFrame.origin.y = 0;
[UIView beginAnimations:@"nil1" context:nil];
[UIView setAnimationDuration:0.3f];
[viewTop setFrame:newFrame];
[UIView commitAnimations];
[pool release];
于 2011-10-13T04:30:31.320 に答える