पर रिलीज को कैसे बल दें मैं एआरसी के लिए नया हूं लेकिन समझता हूं कि यह कैसे काम करता है और मैं इसे आजमा रहा हूं। मैं आईओएस पर हूं इसलिए स्मृति एक गंभीर चिंता है।आईओएस
मेरे पास एक MyObject क्लास है जिसमें बहुत से बड़े डेटा हैं। मैं इसे छोड़ना चाहता हूं, और डेटा का एक नया सेट लोड करना चाहता हूं।
MyObject *object;
object = [[MyObject alloc] initWithData:folder1]; // load data from folder1
// later...
object = [[MyObject alloc] initWithData:folder2]; // load data from folder2
इस लीक के बिना ठीक काम करता है, और मैं एआरसी अनुमान लगा रहा हूँ नया असाइनमेंट से पहले एक [वस्तु रिहाई] सम्मिलित करता है। मेरी समस्या यह है कि 'ऑब्जेक्ट' के अंदर डेटा के बाद जारी किया गया है, नया सेट आवंटित किया गया है, और मैं स्मृति से बाहर हूं। मैं वास्तव में क्या करने में सक्षम होना चाहता हूं:
object = nil;
<function to pop the pool, wait till everything is deallocated>
object = [MyObject alloc] initWithData:folder2]; // load data from folder2
लेकिन मुझे यकीन नहीं है कि यह कैसे करें। मैं बाद में एक प्रदर्शन चयनकर्ता पर नया आवंटन चला सकता हूं, लेकिन ऐसा लगता है जैसे मैं अंधेरे में शूटिंग कर रहा हूं और कुछ हैक। ऐसा करने के लिए शायद उचित तरीका है?
पीएस मैंने जवाब खोजने की कोशिश की है, लेकिन सभी परिणाम स्मृति लीक के बारे में हैं और यह सुनिश्चित करने के लिए कि वेरिएबल्स गुंजाइश से बाहर निकलते हैं और शून्य आदि को चर सेट करते हैं। मेरा मुद्दा इसके बारे में नहीं है, यह अधिक है समय की बात
अद्यतन
जवाब के लिए धन्यवाद, मैं पहले से ही
object = nil;
object = [MyObject alloc] initWithData:folder2];
की कोशिश की होगी और यह काम नहीं किया था। मुझे यकीन नहीं था कि यह माना जाता था या नहीं। अब मैं समझता हूं कि यह काम करना चाहिए, लेकिन मेरे पास एक सेकंड के उस अंश के लिए कुछ और होनी चाहिए। मेरे पास अपने सभी init/dealloc विधियों में एनएसएलॉग हैं, और मैं पहले कक्षाओं (माइओब्जेक्ट के इवर्स) के नए उदाहरणों के सभी अंतर्निहितों को देख सकता हूं, और फिर लगभग तुरंत (कुछ एमएस के भीतर), MyObject के dealloc , इसके बाद इसके इवर के deallocs। मैंने @autorelease भी कोशिश की लेकिन वही बात होती है।
मैंने पूरे प्रोजेक्ट की खोज की है और मुझे लगता है कि सभी कोड चिपकाए हैं जो मुझे लगता है कि इससे प्रासंगिक हो सकता है।
@interface AppDelegate : UIResponder <UIApplicationDelegate>;
@property PBSoundSession *soundSession;
@end
//--------------------------------------------------------------
@implementation AppDelegate
// onTimer fired at 60Hz
-(void)onTimer:(NSTimer *) theTimer {
[oscReceiver readIncoming]; // check incoming OSC messages
// then do a bunch of stuff with _soundSession;
}
@end
//--------------------------------------------------------------
@implementation OscReceiver
-(void)readIncoming {
AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
// parse all incoming messages
if(bLoadNewSoundBank) {
NSString *newFolder = parseNewFolder();
appDelegate.soundSession = nil;
appDelegate.soundSession = [MyObject alloc] initWithData:newFolder];
}
}
@end
//--------------------------------------------------------------
@implementation GuiController
// onTimer fired at 10Hz
-(void)onTimer:(NSTimer *) theTimer {
PBSoundSession *soundSession = appDelegate.soundSession;
// update gui with received values
}
@end
मैंने सोचा कि यह GuiController :: OnTimer कि विधि की अवधि के लिए वर्ष appDelegate.soundSession पकड़े में 'soundSession' स्थानीय चर हो सकता है, लेकिन मेरे आश्चर्य जीयूआई कोड के सभी बाहर टिप्पणी (वास्तव में टाइमर को अक्षम करना), कोई फर्क नहीं पड़ता।
क्या उस बिंदु पर पता लगाने का कोई तरीका है जो अभी भी मेरे appDelegate.soundSession पर है? मैंने एक ब्रेकपॉइंट रखा जहां मैंने इसे शून्य पर सेट किया, लेकिन कोई उपयोगी जानकारी नहीं मिली। मैंने आवंटन टेम्पलेट में इंस्ट्रूमेंट्स की कोशिश की, लेकिन वहां कुछ भी उपयोगी नहीं मिला (शायद क्योंकि मुझे नहीं पता कि कहां देखना है)।
यह मेरा आवंटन ट्रैक जैसा दिखता है, आप देख सकते हैं कि स्मृति बहुत देर हो चुकी है! ।
ठीक है, आप नई ऑब्जेक्ट आवंटित/इनिट करने से पहले 'ऑब्जेक्ट = एनआईएल' कर कर जो कुछ भी चाहते हैं उसे प्राप्त करेंगे। –