Сбой с CALayer, проблема с памятью - PullRequest
0 голосов
/ 25 января 2011

Благодарю hotpaw2 за решение моей проблемы с инкрементным рисованием.Увы, я обнаружил проблему с решением при его реализации.Он проявляется как сбой, вызванный памятью, когда я нажимаю на нижнюю часть iphone, чтобы приостановить приложение, а затем перезапустить его.(Я могу запускать приложение до бесконечности, пока я этого не сделаю).Сбой происходит в указанной ниже строке, которая происходит в FooBar, подклассе UIView:

- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();

// @@CRASH here: Program received signal EXC_BAD_ACCESS 
[backingLayer renderInContext:ctx];     // Render the backing layer into current context
[self randomRectangle: ctx];

}

В интерфейсе FooBar я объявил резервный слой как переменную экземпляра:

@private

NSTimer* timer;
CALayer *backingLayer;

В реализации FooBar backingLayer встречается еще раз, в initWithFrame, в следующем абзаце:

    backingLayer = self.layer; 
    // [backingLayer retain];
    // Set its color space and background color
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGFloat components[4] = {0.0f, 0.0f, 0.0f, 1.0f};
    CGColorRef bgColor = CGColorCreate(colorSpace, components);
    backingLayer.backgroundColor = bgColor;
    CGColorRelease(bgColor);
    CGColorSpaceRelease(colorSpace);

Я также должен сказать, что существует NSTimer timer, который определен в initWithFrameметод tick запускается ниже 12 раз в секунду:

- (void)tick
{    
// Tell the view that it needs to re-draw itself

    if (running) {  // Go!
       //  NSLog(@"frameRate: %2.1f, frameCount: %d", frameRate, frameCount);
        [self setNeedsDisplay];
        frameCount++;
    } 
}

Я запускаю инструменты в этом приложении.Утечки памяти не обнаружены.Но когда я запускаю Allocations и (a) приостанавливаю приложение с помощью физической кнопки, (b) коснитесь значка приложения, чтобы он снова запустился, тогда я вижу огромный кластер выделений (~ 2 ГБ) --- и CRASH.

- Джим

1 Ответ

0 голосов
/ 30 января 2011

См. Последний комментарий, который я должен был поставить здесь.Исправлено это, устанавливая BOOL running в ЛОЖЬ, когда приложение переходит в неактивное состояние, сбрасывая его в ИСТИНА, когда оно снова становится активным.

...