2012-09-22 13 views
7
+(void)setup { 
    UIImage* spriteSheet = [UIImage imageNamed:@"mySpriteSheet.png"]; 
    CGRect rect; 
    animation = [NSMutableArray arrayWithCapacity:numberOfFramesInSpriteSheet]; 
    int frameCount = 0; 

    for (int row = 0; row < numberFrameRowsInSpriteSheet; row++) { 
     for (int col = 0; col < numberFrameColsInSpriteSheet; col++) { 
      frameCount++; 
      if (frameCount <= numberOfFramesInSpriteSheet) { 
       rect = CGRectMake(col*frameHeight, row*frameWidth, frameHeight, frameWidth); 
       [animation addObject:[UIImage imageWithCGImage:CGImageCreateWithImageInRect(spriteSheet.CGImage, rect)] ]; 
      } 
     } 
    } 
} 

के साथ मेमोरी लीक एआरसी सक्षम के साथ उपरोक्त कोड संकलित। विश्लेषण टूल एक संभावित स्मृति रिसाव की रिपोर्ट करता है क्योंकि imageWithCGImage :: गिनती +1 के साथ UIImage लौटाता है, तो संदर्भ खो जाता है। लीक्स इंस्ट्रूमेंट में कोई मेमोरी लीक नहीं है। यहाँ क्या चल रहा है?एआरसी

इसके अलावा, के बाद से एआरसी मैन्युअल release ect का उपयोग कर का उपयोग प्रतिबंधित है, कैसे एक रिसाव को ठीक करता है?

किसी को धन्यवाद जो किसी भी सलाह की पेशकश कर सकते हैं।

उत्तर

8

एआरसी प्रबंधित नहीं करता है सी-प्रकार, जिनमें से CGImage माना जा सकता है। आप रेफरी मैन्युअल जारी चाहिए जब आप के साथ मुख्य आधार डेटा संरचना की CGImageRelease(image);

+(void)setup { 
    UIImage* spriteSheet = [UIImage imageNamed:@"mySpriteSheet.png"]; 
    CGRect rect; 
    animation = [NSMutableArray arrayWithCapacity:numberOfFramesInSpriteSheet]; 
    int frameCount = 0; 

    for (int row = 0; row < numberFrameRowsInSpriteSheet; row++) { 
     for (int col = 0; col < numberFrameColsInSpriteSheet; col++) { 
      frameCount++; 
      if (frameCount <= numberOfFramesInSpriteSheet) { 
       rect = CGRectMake(col*frameHeight, row*frameWidth, frameHeight, frameWidth); 
       //store our image ref so we can release it later 
       //The create rule says that any C-interface method with "create" in it's name 
       //returns a +1 foundation object, which we must release manually. 
       CGImageRef image = CGImageCreateWithImageInRect(spriteSheet.CGImage, rect) 
       //Create a UIImage from our ref. It is now owned by UIImage, so we may discard it. 
       [animation addObject:[UIImage imageWithCGImage:image]]; 
       //Discard the ref. 
       CGImageRelease(image); 
      } 
     } 
    } 
} 
+2

यहां मेरे प्रश्न का स्वीकार्य उत्तर भी देखें: http://stackoverflow.com/questions/6260256/what-kind-of-leaks-does-automatic-reference-counting-in-objective-c-not-prevent/6388601 # 6388601 – BoltClock

+0

"नियम बनाने का कहना है कि के साथ किसी भी सी-इंटरफेस विधि" बनाने "यह के नाम पर एक +1 आधार वस्तु है, जो हम स्वयं को रिहा करना चाहिए देता है।" - दोह! बेशक। धन्यवाद कोडाफ़ी! की सराहना की! –

+0

@ जेडओ। कोई बात नहीं। निर्माण नियम वास्तव में दस्तावेज़ों में खोजने के लिए थोड़ा मुश्किल है, लेकिन ऐप्पल के सी-इंटरफेस से निपटने पर यह बहुत महत्वपूर्ण है। [यहां यह है] (https://developer.apple.com/library/mac/documentation/CoreFOundation/Conceptual/CFMemoryMgmt/Concepts/Ownership.html#//apple_ref/doc/uid/20001148-103029) (साथ ही नियम प्राप्त करें)। – CodaFi

3

कोई भी एआरसी के साथ पेश किया गया है समाप्त कर लें। कई बार यह एक समस्या पैदा करता है। इन मामलों में हमें मैन्युअल रूप से स्मृति जारी करना होगा।