Сбой в drawRect - EXEC ПЛОХОЙ ДОСТУП - PullRequest
0 голосов
/ 19 июня 2011

Сбой моего приложения в пользовательском UIView drawRect. Сбой происходит только в ситуации нехватки памяти. (После того, как я запустил некоторые игры или приложения, я переключаю свое приложение с фона на передний план) Перед сбоем он несколько раз вызывал drawRect, один из них, сбой ...

- (void)drawRect:(CGRect)rect {
        NSLog(@"  ## it is in drawRect");
    //NSLog(@"timecardImage: %@ ",[timecardImage description]);
    [timecardImage drawAtPoint:(CGPointMake(0.0f, 0.0f))];
}

Срочный ТБ:

#0  0x31db6c9a in objc_msgSend ()
#1  0x000051c8 in -[Timecard drawRect:] (self=<value temporarily unavailable, due to optimizations>, _cmd=<value temporarily unavailable, due to optimizations>, rect={origin = {x = 0, y = 0}, size = {width = 75, height = 108}}) at /xcode_prj/TimesheetKeeper/Classes/Timecard.m:72
#2  0x34caba04 in -[UIView(CALayerDelegate) drawLayer:inContext:] ()
#3  0x37221fac in -[CALayer drawInContext:] ()
#4  0x37221d2a in backing_callback ()
#5  0x3722177c in CABackingStoreUpdate ()
#6  0x3722117e in -[CALayer _display] ()
#7  0x37220e8c in -[CALayer display] ()
#8  0x3721570c in CALayerDisplayIfNeeded ()
#9  0x372151cc in CA::Context::commit_transaction ()
#10 0x37214fd6 in CA::Transaction::commit ()
#11 0x37213906 in CA::Transaction::pop ()
#12 0x37213884 in +[CATransaction commit] ()
#13 0x34df7bd2 in _UIWindowUpdateVisibleContextOrder ()
#14 0x34df7c66 in +[UIWindow _prepareWindowsForAppResume] ()
#15 0x34df03e4 in -[UIApplication _handleApplicationResumeEvent:] ()
...

Ниже описано, как настроить UIView - self.timecard:

-(void)setupTimecard{
    if (!self.timecard) {       
    self.timecard = [[Timecard alloc] init];
    [self.timecard retain];
    }

    timecard.center = CGPointMake(self.view.center.x,10.0f);
    [self.view insertSubview:timecard atIndex:2];
    }

И, я комментирую viewRontroller's didReceiveMemoryWarning. В viewDidUnload я даже ничего не делаю на "таймкарте" просто выпустите его в Dealloc.

Этот вопрос стоил мне нескольких дней, и я до сих пор понятия не имею. Любые идеи, которые вы, ребята, предоставите, я постараюсь. Спасибо за вашу помощь.


## Готово! ##

-(id)init {

UIImage *image = [UIImage imageNamed:@"timecard3.png"] ;
timecardImage = image;
    [timecardImage retain];    // #1 this is the key.

CGRect frame = CGRectMake(0, 0, image.size.width, image.size.height);
    self = [self initWithFrame:frame];
return self;
}

В drawRect timecardImage является получателем drawAtPoint, который является просто указателем на изображение автоматического выпуска. При появлении предупреждения о памяти, изображение autolease было выпущено. И так сделал мой timecardImage. После того, как я добавлю # 1 строку, просто сохранить, EXC ПЛОХОГО ДОСТУПА никогда не бывает.

Спасибо, ребята.

1 Ответ

0 голосов
/ 19 июня 2011

Вероятно, что timeCardImage освобождается.Если вы retain делаете это (что вам следует делать), вы должны следовать release с nil ing timeCardImage.Это предполагает, что вы release используете значения в ситуации нехватки памяти.

...