मैं वर्तमान में आईफोन के लिए एक ऐप बना रहा हूं और यह पता नहीं लगा सकता कि मुझे लीक्स इंस्ट्रूमेंट टूल में मेमोरी लीक क्यों हो रही है।
यहां कोड है और मैंने दो जगहों पर टिप्पणियां जोड़ दी हैं जहां यह हो रहा है।
NSString *pathname = [[NSBundle mainBundle] pathForResource:self.toUseFile ofType:@"txt" inDirectory:@"/"];
//Line below causes a leak
self.rawCrayons = [[NSString stringWithContentsOfFile:pathname encoding:NSUTF8StringEncoding error:nil] componentsSeparatedByString:@"\n"];
self.sectionArray = [NSMutableArray array];
for (int i = 0; i < 26; i++) [self.sectionArray addObject:[NSMutableArray array]];
for(int i=0; i<self.rawCrayons.count; i++)
{
self.string = [self.rawCrayons objectAtIndex:i];
NSUInteger firstLetter = [ALPHA rangeOfString:[string substringToIndex:1]].location;
if (firstLetter != NSNotFound)
{
NSInteger audio = AUDIONUM(self.string);
NSInteger pictures = PICTURESNUM(self.string);
NSInteger videos = VIDEOSNUM(self.string);
//Line below causes a leak
[[self.sectionArray objectAtIndex:firstLetter] addObject:[[Term alloc] initToCall:NAME(self.string):audio:pictures:videos]];
}
[self.string release];
}
अग्रिम में धन्यवाद!
संपादित करें
यहाँ मेरी संपत्ति घोषणाएँ हैं।
@property (nonatomic, retain) NSArray *filteredArray;
@property (nonatomic, retain) NSMutableArray *sectionArray;
@property (nonatomic, retain) UISearchBar *searchBar;
@property (nonatomic, retain) UISearchDisplayController *searchDC;
@property (nonatomic, retain) NSString *toUseFile;
@property (nonatomic, retain) NSArray *rawCrayons;
@property (nonatomic, retain) NSString *string;
@property (nonatomic, retain) TermViewController *childController;
यहां लीक हैं जो निक वीवर के सुधारों का पालन करने के बाद हो रहे हैं।
एनएससीएफस्ट्रिंग में से एक का विस्तारित संस्करण यहां दिया गया है।
और एक और छवि।
जिम्मेदार कॉलर वाली छवि:
इसके अलावा, क्योंकि यह उपयोगी हो सकता है, यहाँ टर्म के लिए गुण हैं:
@property (nonatomic, retain) NSString *name;
@property (nonatomic) NSInteger numberAudio;
@property (nonatomic) NSInteger numberPictures;
@property (nonatomic) NSInteger numberVideos;
और कार्यान्वयन:
@implementation Term
@synthesize name, numberAudio, numberPictures, numberVideos;
- (Term*)initToCall:(NSString*) toSetName:(NSInteger) audio:(NSInteger) pictures:(NSInteger) videos
{
self.name = [toSetName retain];
self.numberAudio = audio;
self.numberPictures = pictures;
self.numberVideos = videos;
return self;
}
- (NSString*)getName
{
return [[name retain] autorelease];
}
-(void)dealloc
{
[name release];
[super dealloc];
}
@end
3 जवाब
ठीक है, Temp के इस बदले हुए संस्करण को आजमाएं। मैंने गेटटर को हटा दिया है क्योंकि आपके पास पहले से ही संश्लेषित करके एक है। आप नाम के लिए इस तरह गेटर का उपयोग कर सकते हैं:
term.name
समस्या यह थी कि आप नाम कैसे सेट करते हैं: आप नाम की एक प्रति चाहते हैं और इसे बनाए रखने के बिना संश्लेषित सेटर के साथ सेट करना चाहिए। बेशक, आप इसे नाम की प्रतिधारित संपत्ति के साथ सेट कर सकते थे लेकिन आपको इस self.name = toSetName;
की तरह बनाए रखना छोड़ देना चाहिए था। सेटर इसे आपके लिए बरकरार रखेगा।
@property (nonatomic, copy) NSString *name;
@property (nonatomic) NSInteger numberAudio;
@property (nonatomic) NSInteger numberPictures;
@property (nonatomic) NSInteger numberVideos;
@implementation Term
@synthesize name, numberAudio, numberPictures, numberVideos;
- (Term*)initToCall:(NSString*) toSetName:(NSInteger) audio:(NSInteger) pictures:(NSInteger) videos
{
self.name = toSetName;
self.numberAudio = audio;
self.numberPictures = pictures;
self.numberVideos = videos;
return self;
}
-(void)dealloc
{
[name release];
[super dealloc];
}
किसी ऑब्जेक्ट को किसी सरणी में जोड़ने से इंस्टेंस बरकरार रहेगा, इसलिए रिटेन 2 है क्योंकि आप कॉल करते हैं
[[टर्म आवंटन] initToCall..
कुछ ऐसा करें
Term *term = [[Term alloc] initToCall..];
[theArray addObject:term];
[term release];
<मजबूत>1. पता कॉलम में पहली पंक्ति में तीर देखें? इसे क्लिक करें!
<मजबूत>2. क्लिक करने के बाद :)
आपको यह बताना मुश्किल है कि पहला क्यों लीक हो रहा है, क्योंकि हम नहीं जानते कि संपत्ति को क्या घोषित किया गया है। बरकरार है? नकल? असाइन करें? क्या?
आखिरी वाला काफी आत्म व्याख्यात्मक है, हालांकि, आप टर्म ऑब्जेक्ट का स्वामित्व ले रहे हैं, और इसे जोड़े जाने पर इसे जारी नहीं कर रहे हैं। addObject: अपने तर्क को बरकरार रखता है, जिसका अर्थ है कि यदि आपको अब उस शब्द की आवश्यकता नहीं है, तो आपको स्वामित्व छोड़ना होगा। यानी, अपने initToCall::::
के परिणाम के लिए -autorelease
पास करें (जो बीटीडब्ल्यू एक विधि के लिए एक बहुत बुरा नाम है)
परिवर्तन:
[[self.sectionArray objectAtIndex:firstLetter] addObject:[[Term alloc] initToCall:NAME(self.string):audio:pictures:videos]];
प्रति:
Term *tempTerm = [[Term alloc] initToCall:NAME(self.string):audio:pictures:videos];
[[self.sectionArray objectAtIndex:firstLetter] addObject:tempTerm];
[tempTerm release];
किसी वस्तु को आवंटित करके आप इसके रिलीज के लिए जिम्मेदार हैं।
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
iphone
जब तक आप Apple के iPhone और / या iPod टच को विशेष रूप से संबोधित नहीं कर रहे हैं, तब तक इस टैग का उपयोग न करें। हार्डवेयर पर निर्भर न होने वाले प्रश्नों के लिए, [ios] टैग का उपयोग करें। विचार करने के लिए और टैग [xcode] हैं (लेकिन केवल यदि सवाल IDE के बारे में है), [स्विफ्ट], [उद्देश्य-सी] या [कोको-टच] (लेकिन [कोको] नहीं)। कृपया आइट्यून्स ऐप स्टोर के बारे में या आईट्यून्स कनेक्ट के बारे में सवालों से बचना चाहिए। यदि C # का उपयोग कर रहे हैं, तो [मोनो] के साथ टैग करें।
rawCrayons
संपत्ति को कैसे परिभाषित किया जाता है।@property (nonatomic, retain) IBOutlet NSButton *myButton;