टाइल पीडीएफ व्यू मेमोरी लीक कर रहा है (गैर एआरसी) - आईओएस, ऑब्जेक्ट-सी, मेमोरी-लीक, सीजीपीडीएफड्यूमेंट, सीजीपीडीएफ

तो मैं एक बहुत बड़ी और बहुत पुरानी विरासत परियोजना पर काम करता हूं जिसे लगभग 5 साल पहले गैर-एआरसी उद्देश्य सी कोड में कोड किया गया था। मैंने पिछले डेवलपर्स से लिया और अब इस जानवर को बनाए रखना है।

The app allows users to read PDF pages that are अलग फाइलों के रूप में डाउनलोड किया गया। समस्या यह है कि स्क्रीन पर पीडीएफ प्रदर्शित होते हैं, स्मृति को बुरी तरह लीक कर रहा है। लगभग 5 मिनट के लिए सरल पेजिंग के परिणामस्वरूप 400 मेगाहर्ट्ज मेमोरी खपत होती है।

तो ऐप को प्रोफाइल करते समय मैंने कोड की रेखा की खोज की जो कि मुद्दा लगता है। पिछले डेवलपर ने भी एक टिप्पणी छोड़ दी: "TODO DANNY यहां 100% रिसाव" ... धन्यवाद डैनी ...

वैसे भी मैंने कई चीजों और जीवन के लिए कोशिश की हैमैं समझ नहीं सकता कि यह स्मृति क्यों लीक कर रहा है। मेरा अधिकांश काम और अनुभव एआरसी परियोजनाओं के साथ है, इसलिए मैं यह समझने के लिए संघर्ष कर रहा हूं कि यह कोड क्यों लीक हो रहा है।

UIView सबव्यू क्लास निम्नानुसार दिखता है:

- (void)dealloc {
self.pauseDraw = YES;
CGPDFPageRelease(pdfPage);
CGPDFDocumentRelease(pdfDocumentRef);
[super dealloc];
}

- (id)initWithFrame:(CGRect)frame andScale:(CGFloat)scale{
if ((self = [super initWithFrame:frame])) {
CATiledLayer *tiledLayer = (CATiledLayer *)[self layer];

if ([[[UIDevice currentDevice] modelName] isEqualToString:@"iPad 3G"]) {
tiledLayer.tileSize = CGSizeMake(1024, 1024);
tiledLayer.levelsOfDetail = 4;
tiledLayer.levelsOfDetailBias = 4;
} else {
tiledLayer.levelsOfDetail = 4;
tiledLayer.levelsOfDetailBias = 4;
tiledLayer.tileSize = CGSizeMake(2048, 2048);
}
myScale = scale;
}
return self;
}

+ (Class)layerClass {
return [CATiledLayer class];
}

- (void)setPage:(CGPDFPageRef)newPage andDocument:(CGPDFDocumentRef)docRef {
CGPDFPageRelease(pdfPage);
CGPDFDocumentRelease(pdfDocumentRef);
self->pdfPage = CGPDFPageRetain(newPage);
self->pdfDocumentRef = CGPDFDocumentRetain(docRef);
}

- (void) releasePDFsFromMemory {
CGPDFPageRelease(pdfPage);
CGPDFDocumentRelease(pdfDocumentRef);
}

-(void)drawRect:(CGRect)r {}

-(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context {

if(!self.superview){
return;
}

if (pauseDraw) {
return;
}

@autoreleasepool {
CGRect cropBox = CGPDFPageGetBoxRect(pdfPage, kCGPDFCropBox);
int rotate = CGPDFPageGetRotationAngle(pdfPage);

CGContextSaveGState(context);
CGContextTranslateCTM(context, 0, 0);
CGContextScaleCTM(context, myScale, myScale);

switch (rotate) {
case 0:
CGContextTranslateCTM(context, 0, cropBox.size.height);
CGContextScaleCTM(context, 1, -1);
break;
case 90:
CGContextScaleCTM(context, 1, -1);
CGContextRotateCTM(context, -M_PI / 2);
break;
case 180:
case -180:
CGContextScaleCTM(context, 1, -1);
CGContextTranslateCTM(context, cropBox.size.width, 0);
CGContextRotateCTM(context, M_PI);
break;
case 270:
case -90:
self.frame = CGRectMake(0, 0, 768, 1004);
CGContextTranslateCTM(context, cropBox.size.height, cropBox.size.width);
CGContextRotateCTM(context, M_PI / 2);
CGContextScaleCTM(context, -1, 1);
break;
}

CGRect clipRect = CGRectMake(0, 0, cropBox.size.width, cropBox.size.height);
CGContextAddRect(context, clipRect);
CGContextClip(context);

CGContextSetRGBFillColor(context, 1.0, 1.0, 1.0, 1.0);
CGContextFillRect(context, clipRect);

CGContextTranslateCTM(context, -cropBox.origin.x, -cropBox.origin.y);

CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGContextSetRenderingIntent(context, kCGRenderingIntentDefault);

// TODO DANNY leak here 100% ->
CGContextDrawPDFPage(context, pdfPage);

CGContextRestoreGState(context);
}
}

किसी भी प्रकार के मदद की बहुत सराहना की जाएगी!

अग्रिम में धन्यवाद, Eish

उत्तर:

उत्तर № 1 के लिए 1

तो मैं इस मुद्दे को हल करने में कामयाब रहा।

समस्या ऊपर चिपकाए गए कोड के साथ नहीं थी(भ्रामक होने के लिए क्षमा चाहते हैं), समस्या यह थी कि अभिभावक दृश्य की डेलोक विधि में पिछला डेवलपर पर्यवेक्षण से टाइल किए गए पीडीएफ दृश्यों को हटा नहीं रहा था और रिलीज को कॉल करने के बाद वेरिएबल को शून्य पर सेट नहीं कर रहा था।

मैंने इसे डीएसओएलओसी विधि में एनएसएलओजी डालकर खोजा और देखा कि अभिभावक का दृश्य खराब हो रहा था, लेकिन 2 टाइल किए गए पीडीएफ सबव्यूस बिलकुल नहीं थे।

पर्यवेक्षण से उन्हें हटाने के बाद और चर को सेट करने के बाद दोनों डेलोक विधियों को निकाल दिया गया था और ऐप मेमोरी उपयोग स्थायी रूप से आपके पृष्ठ के रूप में नहीं बढ़ता है!


संबंधित सवाल
सबसे लोकप्रिय