ठीक से स्व-रिलीज करने वाली वस्तुओं को परिवर्तित करना ठीक है, इसलिए ऐप्पल ने हमें एआरसी लाया, जो कि महान है। एआरसी में अपना आवेदन दोबारा करने के बाद लगभग सबकुछ ठीक काम करता है और अब विकास और रखरखाव करना बहुत आसान है।एआरसी
एक ऐसी समस्या है जिसे मैं अभी भी समझ नहीं पा रहा हूं।
मेरा नौकरी प्रबंधन कार्यक्रम प्रस्तावों, आदेशों और उनके स्वयं के विंडोज़ पर विभिन्न विवरणों की जानकारी दिखाता है। तो मैं एक विशेष वर्ग जहां WindowControllers आवंटित हो जाता है और initWithWindowNibName के साथ शुरू और फिर खिड़की showWindow साथ दिखाया गया है है:
DetailWindowController *proposalWindowController = [[DetailWindowController alloc] initWithWindowNibName:@"ThePorposalWindow"];
[proposalWindowController showWindow:nil];
एआरसी से पहले WindowController का उदाहरण documentation में दिखाया गया है की तरह रिलीज किया:
- (void)windowWillClose:(NSNotification *)notification
{
[self autorelease];
}
लेकिन अब एआरसी के साथ यह अब संभव नहीं है और इससे भी बदतर हो जाता है, मेरी विशेष कक्षा में जहां विंडोकंट्रोलर आवंटित और शुरू किया गया है, वही विंडो नियंत्रक एआरसी द्वारा जारी किया जाता है क्योंकि विंडो नियंत्रक के लिए कोई सूचक नहीं है।
मेरा विचार एक mutuable सरणी में windowController कॉपी करने के लिए किया गया था:
[proposalWindowArray addObject:proposalWindowController];
[[proposalWindowArray lastObject] showWindow:nil];
और windowControllers प्रतिनिधि विधि windowWillClose मैं अपने विशेष वर्ग के लिए एक सूचना पोस्ट में:
- (void)windowWillClose:(NSNotification *)notification
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"ProposalWindowWillClose" object:[[self window] windowController] userInfo:nil];
}
मेरी विशेष वर्ग में मैं अधिसूचना सुनता हूं और ऑब्जेक्ट को सरणी से हटा देता हूं:
- (void) proposalWindowWasClosed: (NSNotification *) notification
{
[proposalWindowArray removeObjectIdenticalTo:[notification object]];
}
यह काम करता है, लेकिन मुझे अभी भी विश्वास नहीं है कि यह सही तरीका है।
क्या किसी को भी एक ही समस्या है या इसे बेहतर बनाने के लिए एक युक्ति है?
आपका नया तरीका मूल रूप से सही है। एआरसी के साथ, कंपाइलर को बनाए रखने/रिलीज कॉल को सही तरीके से ट्रैक करने में सक्षम होने के लिए आपको ऑब्जेक्ट्स के स्पष्ट संदर्भों को रखने की आवश्यकता है। असल में, मुझे लगता है कि आपको सामान्य रूप से कॉलबैक विधियों में 'रिलीज' को कॉल करने जैसी चाल से बचना चाहिए, चाहे आप एआरसी का उपयोग कर रहे हों या नहीं। –
@RobKeniger: इसके बजाय आप क्या सुझाव देते हैं? कल्पना कीजिए कि हम ऐप प्रतिनिधि में हैं जो आगे/विंडो नियंत्रकों को देखने के लिए क्रियाएं प्राप्त करते हैं और आमतौर पर कई अलग-अलग नियंत्रक शामिल होते हैं। प्रत्येक के लिए एक संपत्ति बनाना अनावश्यक गन्दा लगता है। –