autorelease गुंजाइश

वोट
6

मैं सोच रहा था कि कैसे autorelese iPhone पर काम करता है। मुझे लगता है कि हालांकि आप एक बार एक वस्तु के लिए एक autorelease भेजने यह गारंटी है ब्लॉक के दायरे के अंत तक में बनाए रखा जा करने के लिए autoreleaseभेजा गया था। क्या वो सही है?

मैं में एक निब से एक दृश्य को प्रारंभ किया गया था applicationDidFinishLaunchingनीचे की तरह:

    (void)applicationDidFinishLaunching:(UIApplication *)application {

    loginViewController = [[[LoginViewController alloc] initWithNibName:@LoginView bundle:nil] autorelease];

    [window addSubview: [loginViewController view]];
    [window makeKeyAndVisible];
}

और देखने बिल्कुल भी दिखाई नहीं दिया, सब वहाँ था पर स्क्रीन था UIWindow

अब एक बार मैं हटा दिया autoreleaseनियंत्रक प्रारंभ सब वहाँ पर से चिकनी चला गया के अंत से।

इसके बारे में क्या है?

चीयर्स, लालकृष्ण

24/02/2009 को 14:57
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


4 जवाब

वोट
13

जब आप फोन autorelease, आप वर्तमान autorelease पूल करने के लिए वस्तु का स्वामित्व दे। रन पाश से पहले ही (जैसे एक घटना डिस्पैच एक नया autorelease पूल बनाता है applicationDidFinishLaunching:) और नष्ट कर देता है कि पूल जब घटना खत्म।

जब आप अपने के मालिकाना हक देने के LoginViewControllerautorelease पूल करने के लिए, यह सिर्फ के बाद जारी किया जाता है applicationDidFinishLaunching:पर लौट आएगा। दृश्य नियंत्रक ही deallocates है, यह superview से अपने दृश्य (इस मामले में अपने विंडो) को हटा।

आपका आवेदन प्रतिनिधि के स्वामित्व रखना चाहिए LoginViewControllerऔर releaseएप्लिकेशन प्रतिनिधि के दशक में यह dealloc(या जब आप अपनी प्रवेश पूरे कर चुके हैं और एक अन्य को देखने के लिए पर स्थानांतरित कर दिया) विधि।

24/02/2009 को 20:50
का स्रोत उपयोगकर्ता

वोट
4

डॉन के जवाब पर विस्तार करने के लिए, यह कुछ हद तक कहने के लिए भ्रमित हो सकता है "क्या आप वर्तमान autorelease पूल करने के लिए वस्तु का स्वामित्व दे।" इस वस्तु मतलब करने के लिए गलत समझा जा सकता है जब autorelease पूल बहा दिया जाता है को नष्ट कर दिया जाना निश्चित है। यह सही (हालांकि यह इस मामले में क्या होगा) नहीं है। भेजा जा रहा है -autoreleaseअनुरोध करता है कि autorelease पूल एक भेज -releaseसंदेश जब यह बहा दिया जाता है। कि यदि -releaseसंदेश retainCount = 0 बनाता है, तो वस्तु नष्ट हो जाएगा।

तो, क्रम क्या डॉन की सिफारिश कर रहा है करने के लिए, आप इस दृश्य नियंत्रक का ट्रैक रखने के लिए एक इवर बनाना होगा। क्यों दृश्य गायब हो जाती है की उनकी व्याख्या बिल्कुल सही है; लेकिन आप केवल दृश्य नियंत्रक लीक करने के लिए नहीं करना चाहती। आप इसे पर पकड़ है, और इसे जारी जब आप इसे पूरा कर चुके हैं करना चाहते हैं।

@interface ... {
   LoginViewController *_loginViewController;
}

@property (readwrite, retain) LoginViewController *loginViewController;

@implementation ...
@synthesize loginViewController = _loginViewController;

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    self.loginViewController = [[[LoginViewController alloc] initWithNibName:@"LoginView" bundle:nil] autorelease];

    [window addSubview: [loginViewController view]];
    [window makeKeyAndVisible];
}

- (void)dealloc {
    [_loginViewController release]; _loginViewController = nil;
    [super dealloc];
}
28/04/2009 को 23:13
का स्रोत उपयोगकर्ता

वोट
0

आप अपने को जोड़ रहे हैं के बाद से LoginViewControllerautorelease पूल करने के लिए इसे चलाने के पाश के अंत में जारी किया जा रहा है। जब ऐसा होता है यह भी अपने 'दृश्य छोड़ देता है और यह प्रदर्शित होने से निकाल देता है।

24/02/2009 को 18:50
का स्रोत उपयोगकर्ता

वोट
0

autoreleasepool runloop के अंत में साफ किया जाता है। यह रूप में लंबे समय का मतलब है के रूप में आप विधियां प्रारंभ और सामान करते हैं, यह अभी भी नहीं है।

मैं अपने कोड में त्रुटि नहीं दिखाई दे, लेकिन खिड़की अपने उदाहरण में ठीक से बनाए रखा है।

24/02/2009 को 15:09
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more