मुझे पता है कि मजबूत और कमजोर संपत्ति घोषणाओं में उपयोग किए जाने वाले संशोधक हैं जबकि __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. ——??
दोनों कमजोर उदाहरण चर प्रिंट (शून्य) वस्तुओं वे कमजोर की चर्चा करते हुए थे के बाद कर रहे हैं, नहीं के बराबर की तैयारी में हैं और है यह अपेक्षित है लेकिन मुझे आश्चर्य है कि दोनों कमजोर गुण कमजोर क्यों हैं स्ट्रिंगप्रोपर्टी और कमजोरअरेप्रप्रोपर्टी अभी भी अपने पिछले मूल्यों को प्रिंट कर रहे हैं और व्यवहार कर रहे हैं जैसे वे मजबूती से मजबूत स्ट्रिंगप्रॉपर्टी और मजबूत ऐरेप्रोपर्टी को इंगित कर रहे थे ??
धन्यवाद :)
मैं राउंड 2 में मजबूत ऐरेप्रोपर्टी और कमजोरअरेप्रप्रोपर्टी (शून्य) के रूप में प्राप्त करने में सक्षम हूं। हालांकि, गोल 2 में कमजोर स्ट्रिंगप्रोपर्टी अभी भी "संपत्ति" है। यह बहुत अजीब है क्योंकि एआरसी को तकनीकी रूप से इसे संभालना चाहिए। पीएस- मैंने इसे अपने कंप्यूटर पर चलाया। –
मुझे लगता है कि कारण यह है कि कमजोर संपत्ति को बरकरार रखा जा रहा है क्योंकि मुख्य विधि में एक ऑटोरेलीज पूल है जो ऐप चलाने को संलग्न करता है। ऑटोरेलीज पूल के कारण, कमजोर संपत्ति को तुरंत शून्य पर सेट नहीं किया जा रहा है। हालांकि, मैंने इसे देखने में कोशिश की DidAppear और didReceiveMemoryWarning (स्मृति चेतावनी अनुकरण करके), यह अभी भी शून्य नहीं बन गया है। –
अजीब !! जब मैं इस कोड को एक वास्तविक डिवाइस पर चलाता हूं, तो यह कमजोर उदाहरण चर के साथ-साथ कमजोर गुणों के लिए अपेक्षित परिणाम देता है ... इसका मतलब है कि यह समस्या केवल सिमुलेटर के साथ है।वैसे भी Thxs @ कुणाल श्रीवास्तव – Dipika