2009-09-30 5 views
6

मेरी कक्षा वस्तु में मैंने UIImage के लिए संपत्ति परिभाषित की है। मैं कुछ बिंदु मैं एक और छवि को यह संपत्ति पुन: असाइन करना चाहते हैं पर अगर एक छविछवि नाम के माध्यम से लोड की गई UIImage संपत्ति को बनाए रखें?

[UIImage imageNamed:@"file.png"]; 

के माध्यम से भरी हुई के साथ इस संपत्ति सौंपा, मैं पहले संदर्भ जारी करने के लिए होना चाहिए?

मैं उलझन में हूं क्योंकि रखरखाव संपत्ति से मुझे पता है कि मुझे इसे छोड़ना चाहिए। लेकिन imageNamed: एक सुविधा विधि है (आवंटन का उपयोग नहीं करता है), मुझे यकीन नहीं है कि यहां कौन से नियम लागू होंगे।

अंतर्दृष्टि के लिए धन्यवाद!

उत्तर

2

छवि नामकरण नियमों के अनुसार आपको स्वत: बंद कर दिया गया है। इसे सेटर के माध्यम से एक बनाए रखने वाले गुण के साथ एक संपत्ति को सौंपना इसे बनाए रखेगा। सेटटर के माध्यम से संपत्ति में एक और छवि असाइन करना पुरानी छवि जारी करेगा और नया बनाएगा।

0
docs से

:

... यदि आप एक लौटे छवि वस्तु पर धारण करने के लिए योजना बना रहे हैं, तो आप इसे आप की तरह बनाए रखने चाहिए किसी भी कोको वस्तु।

निहितार्थ यह है कि यदि आप अब इसे पकड़ना नहीं चाहते हैं, तो आपको इसे जारी करना चाहिए (माना जाता है कि आपने इसे बनाए रखा है)।

1

जब आप nonatomic & retain के साथ एक संपत्ति को परिभाषित है, यह एक सेटर बनाता है के लिए आपको लगता है कि इस तरह दिखता है:

-(void)setImage:(UIImage*)newImage { 
    if (image != newImage) { 
    [image release]; 
    image = [newImage retain]; 
    } 
} 

आप देख सकते हैं, यह नई मूल्य बनाए रखने से पहले पिछले मान विज्ञप्ति।

आपके विशेष मामले में, -[UIImage imageNamed:] द्वारा लौटाई गई ऑटोरेलेज्ड छवि स्वचालित रूप से तब तक बनाए रखी जाएगी जब आप इसे संपत्ति में असाइन करते हैं, और तब जब आप किसी अन्य छवि (या nil) को संपत्ति में स्वचालित रूप से असाइन करते हैं तो स्वचालित रूप से रिलीज़ हो जाते हैं।

0

आप सभी वस्तुओं आप को बनाए रखने रहे हैं, को रिहा करना चाहिए लेकिन जब आप अपनी छवि वस्तु को परिभाषित, मेरा मानना ​​है कि अपने कोड इस तरह दिखना चाहिए:

UIImage *img = [[UIImage imageNamed:@"file.png"] retain]; 
6

सही है, फ्लोरिन ... लेकिन इसके बाद के संस्करण चर्चा के अनुसार , यदि कोई संपत्ति के लिए एक सेटटर का उपयोग कर रहा है (या तो संश्लेषण के माध्यम से, या मैन्युअल रूप से) "बनाए रखने" करता है, तो अतिरिक्त बनाए रखने की कोई आवश्यकता नहीं है।

दूसरे शब्दों में, निम्नलिखित सही होंगे (और स्मृति-रिसाव से मुक्त), आईएमएचओ, क्या मैं सही हूँ? मुझे लगता है कि यह सवाल का मूल उद्देश्य था ... और मैं भी निश्चित होना चाहता हूं। ;-) धन्यवाद!

@interface MyClass { 
    UIImage *myImage; 
} 
@property (nonatomic, retain) UIImage *myImage; 
@end 

@implementation MyClass 
@synthesize myImage; 

- (void) someMethod { 

    self.myImage = [UIImage imageNamed:@"foo.png"]; 
} 

- (void) someOtherMethod { 

    self.myImage = [UIImage imageNamed:@"bar.png"]; 
} 

- (void) dealloc { 

    self.myImage = nil; 
    [super dealloc]; 
} 
@end 
+0

यह सही है। 'self.myImage = someImage' का उपयोग कर सेटर विधि को कॉल करता है, जो आपके लिए इसे बरकरार रखता है। और '[UIImage imageNamed:]' एक स्वत: चित्रित छवि देता है, जिसका अर्थ है कि आपको इसके बाद साफ करना नहीं है। –

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