我有一個5選項卡欄控制器iPad應用程序。 其中一個選項卡(EKG)導致內存問題。我已經運行了儀器,所有我可以看到的是,malloc
分配不斷增加,大約12分鐘後,我的所有View Controller首先獲得didReceiveMemoryWarning
級別1,然後是級別2,然後是SigAbort 0 termination
。在iPad上導致內存問題的drawRect
應用程序設計工作的方式是當EKG選項卡處於活動狀態時,每200毫秒觸發一個setNeedsDisplay
,以便在整個屏幕上繪製(繪製)EKG樣本。當我讓應用程序正常運行時,它會在約12分鐘後終止。
但是,如果我保留setNeedsDisplay
並註釋掉drawRect
中的代碼,它將永遠運行 。我不是我「的drawRect」知道任何內存分配,但有人做這些mallocs
下面是我的drawRect
代碼:
- (void) drawRect : (CGRect) rect
{
int i, ii, x = 0, xx, y;
fEcgDraw = YES;
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth (context, 1);
HH = 376;
if (fEcgErase == YES)
{
CGContextSetStrokeColorWithColor (context,
[UIColor blackColor].CGColor);
/*==============================================================================*/
/* Erase the last screen. */
/*==============================================================================*/
for (i = 0; i < 120; i++)
{
CGContextMoveToPoint (context,
ECGX[x],
(HH - ECGS[x]));
CGContextAddLineToPoint (context, ECGX[(x + 1)],
(HH - ECGS[((x + 1) % 119)]));
x++;
} // end - for (i = 0; i < 120; i++)
CGContextStrokePath (context);
fEcgErase = NO;
} // end - if (fEcgErase == YES)
else if (fECGLOOP)
{
xx = 1;
x = 0;
y = YY;
ii = 0;
for (i =
{
// if (xx == 1)
{
/*==============================================================================*/
/* First erase the prior ECG A/D plot value. */
/*==============================================================================*/
CGContextSetStrokeColorWithColor (context,
[UIColor blackColor].CGColor);
CGContextMoveToPoint (context,
ECGX[x],
(HH - ECGS[x]));
CGContextAddLineToPoint (context,
ECGX[(x + 1)],
(HH - ECGS[((x + 1))]));
CGContextStrokePath (context);
/*==============================================================================*/
/* Now plot the next ECG A/D plot value. */
/*==============================================================================*/
CGContextSetStrokeColorWithColor (context,
[UIColor whiteColor].CGColor);
CGContextMoveToPoint (context,
ECGX[x],
(HH - ECGY[y]));
CGContextAddLineToPoint (context,
ECGX[(x + 1)],
(HH - ECGY[((y + 1) % 119)]));
CGContextStrokePath (context);
ECGS[x] = ECGY[y];
x++;
y = ((y + 1) % 119);
} // end - if (xx == 1)
} // end - for (i = 0; i < 120; i++)
y = ((y + count1) % 119);
YY = y;
count1 = 0;
} // end - if (fEcgErase == YES)
fEcgDraw = NO;
} // end - 'drawRect'
/*===============================END OF FUNCTION================================*/
我已經嘗試註釋掉「的drawRect」,並在「setNeedsDisplay」離開,這使問題消失。我不理解你對iver&gvars的評論,特別是gvars,因爲根據定義,他們只有一個實例。至於ivars,我不明白怎麼可能有多個,因爲沒有類實例可以分配更多的ivars。 –