2016-12-22 8 views
6

मुझे पता है कि मजबूत और कमजोर संपत्ति घोषणाओं में उपयोग किए जाने वाले संशोधक हैं जबकि __strong और __weak का उपयोग आवृत्ति चर की घोषणाओं में किया जाता है ... मजबूत कहता है कि ऑब्जेक्ट को स्मृति में लंबे समय तक रखें जैसा कि मैं इसका मालिक हूं और कमजोर कहता है कि ऑब्जेक्ट को स्मृति में तब तक रखें जब तक कि किसी और के पास इसका मजबूत संदर्भ न हो ... सही? लेकिन मुझे संपत्ति के लिए कमजोर क्यों नहीं मिल रहा है और उदाहरण के लिए __weak अलग-अलग व्यवहार करता है ?? यहाँ मैं क्या सोच ...उदाहरण के लिए संपत्ति के लिए कमजोर क्यों है और उदाहरण के लिए __weak अलग-अलग व्यवहार करते हैं

@interface DemoViewController(){ 

    __weak NSArray *weakArray; 
    __strong NSArray *strongArray; 
    __weak NSString *weakString; 
    __strong NSString *strongString; 
} 

@property (weak) NSString *weakStringProperty; 
@property (strong) NSString *strongStringProperty; 

@property (weak) NSArray *weakArrayProperty; 
@property (strong) NSArray *strongArrayProperty; 

@end 

@implementation DemoViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    strongArray = [[NSArray alloc] initWithObjects:@"one",@"two", nil]; 
    weakArray = strongArray; 

    NSLog(@"Round:1 strongArray is %@.", strongArray); 
    NSLog(@"Round:1 weakArray is %@.", weakArray); 

    strongArray = nil; 

    NSLog(@"Round:2 strongArray is %@.", strongArray); 
    NSLog(@"Round:2 weakArray is %@.", weakArray); 

    self.strongArrayProperty = [[NSArray alloc] initWithObjects:@"one",@"two", nil]; 
    self.weakArrayProperty = self.strongArrayProperty; 

    NSLog(@"Round:1 strongArrayProperty is %@.", self.strongArrayProperty); 
    NSLog(@"Round:1 weakArrayProperty is %@.", self.weakArrayProperty); 

    self.strongArrayProperty = nil; 

    NSLog(@"Round:2 strongArrayProperty is %@.", self.strongArrayProperty); 
    NSLog(@"Round:2 weakArrayProperty is %@.", self.weakArrayProperty); 


    strongString = [[NSString alloc]initWithFormat:@"instanceVariable"]; 
    weakString = strongString; 

    NSLog(@"Round:1 strongString is %@.", strongString); 
    NSLog(@"Round:1 weakString is %@.", weakString); 

    strongString = nil; 

    NSLog(@"Round:2 strongString is %@.", strongString); 
    NSLog(@"Round:2 weakString is %@.", weakString); 

    self.strongStringProperty = [[NSString alloc]initWithFormat:@"Property"]; 
    self.weakStringProperty = self.strongStringProperty; 

    NSLog(@"Round:1 strongStringProperty is %@.", self.strongStringProperty); 
    NSLog(@"Round:1 weakStringProperty is %@.", self.weakStringProperty); 

    self.strongStringProperty = nil; 

    NSLog(@"Round:2 strongStringProperty is %@.", self.strongStringProperty); 
    NSLog(@"Round:2 weakStringProperty is %@.", self.weakStringProperty); 

} 
@end 

और यहाँ हुई लॉग

Round:1 strongArray is (
    one, 
    two 
). 
Round:1 weakArray is (
    one, 
    two 
). 
Round:2 strongArray is (null). 
Round:2 weakArray is (null). 


Round:1 strongArrayProperty is (
    one, 
    two 
). 
Round:1 weakArrayProperty is (
    one, 
    two 
). 
Round:2 strongArrayProperty is (null). 
Round:2 weakArrayProperty is (
    one, 
    two 
).   —??? 

Round:1 strongString is instanceVariable. 
Round:1 weakString is instanceVariable. 
Round:2 strongString is (null). 
Round:2 weakString is (null). 


Round:1 strongStringProperty is Property. 
Round:1 weakStringProperty is Property. 
Round:2 strongStringProperty is (null). 
Round:2 weakStringProperty is Property. ——?? 

दोनों कमजोर उदाहरण चर प्रिंट (शून्य) वस्तुओं वे कमजोर की चर्चा करते हुए थे के बाद कर रहे हैं, नहीं के बराबर की तैयारी में हैं और है यह अपेक्षित है लेकिन मुझे आश्चर्य है कि दोनों कमजोर गुण कमजोर क्यों हैं स्ट्रिंगप्रोपर्टी और कमजोरअरेप्रप्रोपर्टी अभी भी अपने पिछले मूल्यों को प्रिंट कर रहे हैं और व्यवहार कर रहे हैं जैसे वे मजबूती से मजबूत स्ट्रिंगप्रॉपर्टी और मजबूत ऐरेप्रोपर्टी को इंगित कर रहे थे ??

धन्यवाद :)

+0

मैं राउंड 2 में मजबूत ऐरेप्रोपर्टी और कमजोरअरेप्रप्रोपर्टी (शून्य) के रूप में प्राप्त करने में सक्षम हूं। हालांकि, गोल 2 में कमजोर स्ट्रिंगप्रोपर्टी अभी भी "संपत्ति" है। यह बहुत अजीब है क्योंकि एआरसी को तकनीकी रूप से इसे संभालना चाहिए। पीएस- मैंने इसे अपने कंप्यूटर पर चलाया। –

+0

मुझे लगता है कि कारण यह है कि कमजोर संपत्ति को बरकरार रखा जा रहा है क्योंकि मुख्य विधि में एक ऑटोरेलीज पूल है जो ऐप चलाने को संलग्न करता है। ऑटोरेलीज पूल के कारण, कमजोर संपत्ति को तुरंत शून्य पर सेट नहीं किया जा रहा है। हालांकि, मैंने इसे देखने में कोशिश की DidAppear और didReceiveMemoryWarning (स्मृति चेतावनी अनुकरण करके), यह अभी भी शून्य नहीं बन गया है। –

+0

अजीब !! जब मैं इस कोड को एक वास्तविक डिवाइस पर चलाता हूं, तो यह कमजोर उदाहरण चर के साथ-साथ कमजोर गुणों के लिए अपेक्षित परिणाम देता है ... इसका मतलब है कि यह समस्या केवल सिमुलेटर के साथ है।वैसे भी Thxs @ कुणाल श्रीवास्तव – Dipika

उत्तर

1

weakStringPropertynil क्योंकि यह फाउंडेशन अभी भी यह बनाए रखना है नहीं है।

जब आप [[NSString alloc]initWithFormat:@"Property"] कहलाते हैं, तो फाउंडेशन ने स्ट्रिंग को NSTaggedPointerString के रूप में प्रशिक्षित करने का निर्णय लिया जो इसे भविष्य के उपयोग के लिए बनाए रखा गया। आप कक्षा प्रवेश करके यह पुष्टि कर सकते हैं:

NSLog(@"kindof: %@", [self.weakStringProperty class]); 

मुझे यकीन है कि क्या सभी मानदंडों प्रणाली तय करने के लिए उपयोग करता है इन तार बनाने के लिए है, लेकिन लंबाई और अस्थिरता कारक हैं नहीं कर रहा हूँ। निम्नलिखित में से कोई भी आपका वांछित परिणाम प्राप्त करेगा।

// Longer string 
self.strongStringProperty = [[NSString alloc]initWithFormat:@"Property la la la"]; 

// Mutable string 
self.strongStringProperty = [[NSMutableString alloc]initWithFormat:@"Property"]; 
1

आपकी संपत्ति परमाणु हैं, क्योंकि आपने उन्हें nonatomic घोषित नहीं किया था। परमाणु गुण एक वस्तु को वापस रखे जाते हैं जो बनाए रखा जाता है और ऑटोरेलेज्ड होता है, इसलिए ऑब्जेक्ट ऑटोरेलीज पूल में रहेगा और जब तक आप viewDidLoad विधि से बाहर नहीं निकलते तब तक बनाए रखा जाता है।

@property (weak, nonatomic, readwrite) NSString *weakStringProperty; 

उदाहरण के लिए

बदलें और आप अधिक अपेक्षित परिणाम मिलने की संभावना है। या बाद में किसी अन्य विधि में गुणों की जांच करें, और कमजोर गुणों की संभावना शून्य होगी।

हालांकि, आईओएस अक्सर ऐसी वस्तुओं को बनाता है जो कभी जारी नहीं किए जाएंगे। उदाहरण के लिए, एक खाली एनएसएआरआरई ऑब्जेक्ट है जो कभी भी जारी नहीं किया जाएगा। कई NSNumber ऑब्जेक्ट्स, लघु तार, @YES और @NO और अन्य के लिए समान है। इस बात की कोई गारंटी नहीं है कि जब आप सोचेंगे तो एक वस्तु को हटा दिया जाएगा, और इसलिए कोई गारंटी नहीं है कि एक कमजोर वस्तु शून्य हो जाती है।

+0

सिम्युलेटर पर ... मैंने आपके द्वारा किए गए परिवर्तनों के साथ प्रयास किया और परिणाम के रूप में ... गुण अभी भी दृश्य में शून्य पर सेट नहीं हो रहे थे DidLoad और viewWillAppear लेकिन दृश्य में शून्य पर सेट करें। लेकिन अजीब चीज यह है कि जब मैं इसे किसी डिवाइस पर चलाता हूं तो सभी कमजोर प्रोपरीज़ ऑब्जेक्ट्स के बाद शून्य पर सेट हो रहे थे, जो वे इंगित कर रहे थे और अपेक्षित परिणामों को लॉगिंग कर रहे थे। वैसे भी thxs :) – Dipika

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