2009-03-29 11 views
26

मेरे पास कुछ दृश्य हैं जो मूवी प्लेयर तक पहुंचते हैं। मैंने इन विचारों के लिए AppDelegate में एक विधि में निम्न कोड डाला है। वे फ़ाइल नाम में खेलने के लिए भेजते हैं। कोड ठीक काम करता है लेकिन मुझे पता है कि कहीं रिलीज की आवश्यकता है। अगर मैं रिलीज या ऑटोरेलीज के रूप में अंतिम पंक्ति जोड़ता हूं, तो उपयोगकर्ता मूवीप्लेयर पर किए जाने के बाद ऐप क्रैश हो जाएगा।MPMoviePlayerController को कैसे रिलीज़ करें?

MPMoviePlayerController *moviePlayer = [[MPMoviePlayerController alloc] 
       initWithContentURL:[NSURL fileURLWithPath:moviePath]]; 
moviePlayer.movieControlMode = MPMovieControlModeDefault; 
[moviePlayer play]; 
//[moviePlayer release]; 

मैं इस त्रुटि मिलती है:

ObjC [51051]: मुक्त कर दिया (आईडी): "EXC_BAD_INSTRUCTION": संदेश videoViewController मुक्त कर दिया वस्तु के लिए भेजा = 0x1069b30

कार्यक्रम संकेत प्राप्त किया।

मुझे प्लेयर को कैसे जारी किया जाना चाहिए?

उत्तर

18

जो मैंने पाया है वह है कि MPMoviePlayerController को इसे सुरक्षित रूप से रिलीज़ करने से पहले स्टॉप संदेश भेजना होगा। तो मैं इसे हैंडल में करता हूं प्लेबैक अंत - पहले मैं इसे रोकता हूं, फिर मैं इसे स्वत: छोड़ देता हूं। कॉलिंग रिहाई भी अच्छी तरह से काम करने लगते हैं नहीं करता है:

- (void) moviePlayBackDidFinish : (NSNotification *) notification 
{ 
    VideoPlayerController * player = notification.object; 
    [player stop]; 
    [player autorelease]; 
} 

पूरी बात कुछ ही देर में जटिल काम है कि MPMoviePlayerPlaybackDidFinishNotification एक बार से अधिक भेजा प्राप्त कर सकते हैं हो जाता है, लेकिन बुला बंद/autorlease दो बार आप किसी भी अच्छा या तो काम नहीं चलेगा । तो आपको किसी भी तरह से रक्षा करने की जरूरत है।

आखिरकार, यह मुख्य रन लूप के कुछ पुनरावृत्तियों को लेता है जब तक आप सुरक्षित रूप से एक नया MPMoviePlayerController उदाहरण बना सकते हैं। यदि आप इसे बहुत जल्दी करते हैं, तो आपको ध्वनि मिलेगी लेकिन कोई वीडियो नहीं होगा। बहुत मज़ा, हुह?

+0

हाँ- मुझे पहले से ही ध्वनि/कोई वीडियो चीज़ नहीं मिली है। बहुत बढ़िया!आप एकाधिक अधिसूचनाओं के खिलाफ कैसे सुरक्षा करते हैं? यदि आप एकाधिक संभालते हैं तो क्या यह क्रैश होगा? – 4thSpace

+0

आपको कुछ प्रकार का झंडा होना होगा: यदि यह सेट नहीं है, तो इसे सेट करें और प्लेयर को छोड़ दें। यदि यह सेट है, तो कुछ भी मत करो। –

+4

आप शायद MPMoviePlayerController को प्रतिनिधि में एक ivar के रूप में भी स्टोर कर सकते हैं। मूवी प्लेबैकडिडफिनिश में: विधि आप ivar को छोड़ सकते हैं और अधिसूचना.बोजेक्ट तक पहुंचने के बजाय इसे शून्य पर सेट कर सकते हैं। दूसरी अधिसूचना स्टॉप और ऑटोरेलीज को शून्य भेज देगी, जो ठीक है। –

7

ऊपर जवाब पर 4thSpace की टिप्पणी का उत्तर देने के लिए, आपको सूचना पर्यवेक्षक को हटा सकते हैं, तो आप इसे एक से अधिक बार नहीं प्राप्त करते हैं:

- (void)moviePlayBackDidFinish:(NSNotification *)notification { 
    MPMoviePlayerController *theMovie = [notification object]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self 
     name:MPMoviePlayerPlaybackDidFinishNotification 
     object:theMovie]; 
    [theMovie stop]; 
    [theMovie release]; 
} 
+0

मैंने यह कोशिश की है, लेकिन मेरी स्मृति खपत कम नहीं होती है? क्या इसका मतलब है कि स्मृति अभी तक जारी नहीं है? – Nnp

2

रोकना और जारी करता है, तो खिलाड़ी पर नहीं पहुंचे मेरे लिए पर्याप्त नहीं था इसके अंत में।

मेरे समाधान इसे जारी करने से पहले moviePlayBackDidFinish: पर moviePlayer.initialPlaybackTime = -1 स्थापित कर रही है:

-(void)playMovie: (NSString *)urlString{ 
    movieURL = [NSURL URLWithString:urlString]; 
    moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:movieURL]; 
    moviePlayer.initialPlaybackTime = 0; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(moviePlayBackDidFinish:) name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer] ; 

    moviePlayer.scalingMode = MPMovieScalingModeAspectFit; 
    moviePlayer.movieControlMode = MPMovieControlModeDefault; 
    moviePlayer.backgroundColor = [UIColor blackColor]; 

    [moviePlayer play]; 
} 

-(void)moviePlayBackDidFinish: (NSNotification*)notification{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:moviePlayer] ; 

    moviePlayer.initialPlaybackTime = -1; 

    [moviePlayer stop]; 
    [moviePlayer release]; 
} 
0

मैं एक ही समस्या थी और मैं बस महसूस किया कि मैं सेट वस्तु के साथ सूचना विधि: शून्य (यह एक कॉपी पेस्ट था) ।

मुझे कई अधिसूचनाएं थीं हालांकि मुझे कोई अधिसूचना नहीं होनी चाहिए थी।

यहाँ मेरी नई अधिसूचना कोड है कि सभी तय की स्थापना की है (वस्तु देखें: movieplayer):

[[NSNotificationCenter defaultCenter] addObserver:self 
          selector:@selector(moviePlaybackDidFinish:) 
          name:MPMoviePlayerPlaybackDidFinishNotification 
          object:moviePlayer]; 

आशा है कि मदद करता है। अब मेरा पूरा कोड ठीक से काम कर रहा है।

3

आईफोन के लिए 3.2 आपको [मूवीप्लेयर विराम] पर कॉल करने की आवश्यकता है; पर कॉल करने से पहले [मूवीप्लेयर स्टॉप];

+0

इसके लिए धन्यवाद! इस मुद्दे पर पागल हो रहा था! – lostInTransit

+0

धन्यवाद !!! पुराने ओएस संस्करणों का समर्थन करना इतना दर्दनाक हो सकता है। –

0

यह स्मृति को काफी कम करने लग रहा था। हालांकि आईओएस 4.1 के लिए यह ठीक लगता है।

- (void)videoFinishedCallback:(NSNotification *)aNotification 
{ 
    thePlayer = [aNotification object]; 
    [[NSNotificationCenter defaultCenter] 
    removeObserver:self 
    name:MPMoviePlayerPlaybackDidFinishNotification object:thePlayer]; 

    thePlayer.initialPlaybackTime = -1; 

    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200 
     [thePlayer pause]; 
    #endif 

    [thePlayer stop]; 
    [thePlayer release];  
} 
संबंधित मुद्दे