5 탭 탭바 컨트롤러 iPad 응용 프로그램이 있습니다. 탭 중 하나 (EKG)가 메모리 문제를 일으키고 있습니다. 나는 Instruments를 실행했고 내가 볼 수있는 것은 malloc
할당이 지속적으로 증가하고 약 12 분 후에 모든 View Controller가 처음으로 didReceiveMemoryWarning
레벨 1, 그 다음 레벨 2, 그리고 SigAbort 0 termination
을 얻는다는 것입니다.iPad에서 drawRect로 인해 메모리 문제가 발생합니다.
앱이 작동하도록 설계된 방식은 EKG 탭이 활성화되어있을 때 setNeedsDisplay
이 200-ms마다 트리거되어 화면에 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, espcially gvars에 대한 귀하의 의견을 이해하지 못합니다. 지금까지는 ivars를 할당 할 클래스 인스턴스화가 없기 때문에 배수가 될 수있는 방법을 이해하지 못합니다. –