2014-08-29 6 views
5

का उपयोग कर रहा एआरसी का उपयोग कर iOS 7 पर एक परियोजना के विकास कर रहा हूँ, मैं एक निजी संपत्ति रिलीज़ करना चाहते जब ViewController
जारी किया गया है यहाँ TestViewController कि एक मॉडल दृश्य के रूप में प्रस्तुत किया जाता है है नियंत्रक, viewDidLoad में निजी संपत्ति testAVPlayer के लिए एक मूल्य की स्थापना:iOS 7 में निजी संपत्ति को रिहा करने के लिए कैसे एआरसी

//TestViewController.m 
#import "TestAVPlayer.h" 
@interface TestViewController() { 
    TestAVPlayer *testAVPlayer; 
} 

@end 

- (void)viewDidLoad 
{ 
    [self setupPlayer]; 
} 

- (void)setupPlayer { 
    AVPlayerItem *item = [AVPlayerItem playerItemWithURL:[[NSBundle mainBundle] URLForResource:@"music" withExtension:@"mp3"]]; 
    testAVPlayer = [TestAVPlayer playerWithPlayerItem:item]; 

    [testAVPlayer setActionAtItemEnd:AVPlayerActionAtItemEndNone]; 
    [testAVPlayer play]; 
} 

- (void)dealloc { 
    NSLog(@"dealloc TestViewController: %@", self); 
} 

TestAVPlayer AVPlayer का एक उपवर्ग है, मैं एक NSLog dealloc

// TestAVPlayer.h 
#import <AVFoundation/AVFoundation.h> 

@interface TestAVPlayer : AVPlayer 

@end 

// TestAVPlayer.m 
#import "TestAVPlayer.h" 

@implementation TestAVPlayer 

- (void)dealloc { 
    NSLog(@"dealloc testAVPlayer: %@", self); 
} 
@end 

जब TestViewController खारिज किया जाता है में, डाल testAVPlayer कभी जारी नहीं लगता है, तो मैं "dealloc TestViewController" देखते हैं, लेकिन कोई "dealloc testAVPlayer" कंसोल लॉग

+0

आपको एआरसी के पूरे बिंदु को अस्वीकार करने की आवश्यकता नहीं है ... – meda

+3

@meda yes, लेकिन एआरसी द्वारा जारी किए जाने पर 'dealloc' को अभी भी कॉल किया जाना चाहिए। वस्तु को बरकरार रखना चाहिए, लेकिन मुझे डर है कि यहां जाने के लिए पर्याप्त नहीं है। –

+0

आप इसे ब्लॉक में कहीं भी रख सकते हैं या अमान्यता के बिना दोहराने वाले टाइमर का उपयोग कर सकते हैं। अब पर्याप्त जानकारी नहीं है। –

उत्तर

10

मैं अपने कोड की कोशिश की, समस्या, भले ही आप फोन [TestAVPlayer playerWithPlayerItem:item]TestAVPlayer वर्ग इस तरह के विधि नहीं है कि है, इसलिए यह से playerWithPlayerItem: समारोह कॉल करेंगे AVPlayer आधार वर्ग, जो TestAVPlayer कक्षा के बजाय AVPlayer कक्षा का एक उदाहरण लौटाएगी। कंपाइलर आपको कोई चेतावनी नहीं देगा क्योंकि playerWithPlayerItem: विधि id का एक प्रकार देता है। आप डीबगर के साथ इसे चेक करते हैं तो आप देखेंगे कि निजी चर के प्रकार TestAVPlayer नहीं है: जैसी कोई वस्तु बनाया गया था

enter image description here

TestAVPlayer की dealloc कभी नहीं बुलाया जाएगा। AVPlayer इंस्टेंस को हटा दिया जाता है जब TestViewController को हटा दिया जाता है। आप इसे इंस्ट्रूमेंट्स का उपयोग करके या सिंबल ब्रेकपॉइंट से [AVPlayer dealloc] जोड़कर देख सकते हैं।

ब्रेकपॉइंट नेविगेटर का चयन करें और + बटन पर क्लिक करें और एक सिंबल ब्रेकपॉइंट जोड़ें।

प्रतीक क्षेत्र और Enter दबाना लिखें [AVPLayer dealloc]।जब आप एप्लिकेशन चलाते हैं और TestViewController को हटा दिया जाता है तो आप देखेंगे कि ब्रेकपॉइंट मारा जाएगा, इसलिए AVPlayer वास्तव में अस्वीकृत हो जाता है।

2

testAVPlayer = [AVPlayer playerWithPlayerItem:playerItem];

में आप AVPlayer नहीं, बल्कि आपके TestAVPlayer का उपयोग कर रहे है।

+0

बीटीडब्ल्यू यह सही जवाब होना चाहिए। :) मैंने ध्यान नहीं दिया कि उप-वर्ग के बजाय AVPlayer का उपयोग किया जाता है। –

+0

मैंने अपने कोड को संपादित किया, AVAlayer को TestAVPlayer के साथ बदल दिया, लेकिन इसे अभी भी – bandw

+0

@bandw जारी नहीं किया जा सकता है क्या आपने कहीं और 'testAVPlayer' तक पहुंचाया था? –

5

आप अपनी ऑब्जेक्ट को आरंभ करने के लिए क्लास फ़ैक्टरी विधि का उपयोग कर रहे हैं, जिसका अर्थ है कि आपके पास testAVPlayer ऑब्जेक्ट नहीं है और इस प्रकार इसे रिलीज़ करने के लिए ज़िम्मेदार नहीं है।

अधिक जानकारी के लिए उद्देश्य-सी प्रोग्रामिंग मार्गदर्शिका में अवधारणाओं से Class Factory Methods देखें।

testAVPlayer = [[TestAVPlayer alloc] initWithPlayerItem:item]; 

और अपने dealloc विधि बुलाया जाएगा:

आप वास्तव में के मालिक हैं और इस वस्तु के जीवनकाल को नियंत्रित करना चाहते हैं, तो निम्न प्रारंभकर्ता का उपयोग करें।

1

testAVPlayer नहीं के बराबर तो - viewDidUnload को लागू करने का प्रयास करें:

- (void) viewDidUnload 
{ 
    [super viewDidUnload]; 
    testAVPlayer = nil; 
} 
1

यद्यपि आप [TestAVPlayer playerWithPlayerItem:item] के रूप में यह बुला रहे हैं, क्या तुम सच में AVPlayer, नहीं TestAVPlayer का एक उदाहरण वापस हो रही है। वास्तव में, AVPlayer उदाहरण जो आपने बनाया है वास्तव में हटाया जा रहा है। आप अपने लॉग को डेलोक में नहीं देख पाएंगे क्योंकि उस वर्ग का एक उदाहरण कभी नहीं बनाया गया है।

जैसा कि किसी अन्य द्वारा सुझाया गया है, [TestAVPlayer playerWithPlayerItem:item] को [[TestAVPlayer alloc] initWithPlayerItem:item]; के साथ बदलें और आपको अपने लॉग देखना शुरू करना चाहिए।

संबंधित मुद्दे